本文介绍了PersistenceException:更新对象时执行DML bindLog错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

美好的一天!我有两个对象:TagRelatedTag. Tag可以有多个RelatedTag(也是一个Tag).保存Tag及其相关标签可以正常工作.但是,当我更新Tag时,出现错误消息

Good day! I have two objects: Tag and RelatedTag. The Tag can have many RelatedTags (which is also a Tag). Saving the Tag with its related tags works fine. But when I update the Tag, it has an error saying

[PersistenceException: ERROR executing DML bindLog[] error[Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.RELATED_TAG(ID)"; SQL statement:\n insert into related_tag (id, tag_id, relationship, related_notes) values (?,?,?,?) [23505-172]]]

这是Tag模型:

package models;

import java.util.*;

import javax.persistence.*;
import javax.validation.*;

import play.data.Form;
import play.data.validation.Constraints.*;
import play.db.ebean.*;
import play.db.ebean.Model.Finder;
import scala.Int;

@Entity
public class Tag extends Model{

    @Id
    private int id;

    @Required
    @MaxLength(value=100)
    private String name;

    @MaxLength(value=200)
    private String notes;

    @OneToMany(cascade=CascadeType.ALL)
    public List<RelatedTag> relatedTags = new ArrayList<RelatedTag>();

    public static Finder<Integer, Tag> find = new Finder(Int.class, Tag.class);

    public Tag() {

    }

    public Tag(String name, String notes){
        this.name = name;
        this.notes = notes;
    }

    public Tag(int id, String name, String notes, List<RelatedTag> relatedTags) {
        this.id = id;
        this.name = name;
        this.notes = notes;
        this.relatedTags = relatedTags;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    public List<RelatedTag> getRelatedTags() {
        return relatedTags;
    }

    public void setRelatedTags(List<RelatedTag> relatedTags) {
        this.relatedTags = relatedTags;
    }

    public static List<Tag> all() {
        return find.all();
    }

    public static void create(Tag tag){
        tag.save();
    }

    public static void delete(int id){
        find.ref(id).delete();
    }

    public static void update(int id, Tag tag) {
        tag.update(id); // updates this entity, by specifying the entity ID
    }

    public static boolean exists(Tag newTag) {
        for(Tag allTags : Tag.find.all()) {
            if(allTags.getName().equals(newTag.getName()))
                return true;
        }

        return false;
    }

}

这是RelatedTag模型:

package models;

import java.util.*;

import javax.persistence.*;
import javax.validation.*;

import play.data.Form;
import play.data.validation.Constraints.*;
import play.db.ebean.*;
import play.db.ebean.Model.Finder;
import scala.Int;

@Entity
public class RelatedTag extends Model {

    @Id
    private int id;

    private String relationship;

    private String relatedNotes;

    public RelatedTag() {}

    public RelatedTag(int id, String relationship, String relatedNotes) {
        this.id = id;
        this.relationship = relationship;
        this.relatedNotes = relatedNotes;
    }

    public void setId(int id){
        this.id = id;
    }

    public void setRelationship(String relationship){
        this.relationship = relationship;
    }

    public void setRelatedNotes(String relatedNotes) {
        this.relatedNotes = relatedNotes;
    }

    public int getId(){
        return id;
    }


    public String getRelationship(){
        return relationship;
    }

    public String getRelatedNotes() {
        return relatedNotes;
    }

    public static boolean exists(String tagRelated) {
        for(Tag tag : Tag.find.all()) {
            if(tagRelated.equals(tag.getName()))
                return true;
        }
        return false;
    }

    public static RelatedTag findByLabel(String tagRelated, String relation, String relatedNotes) {
        RelatedTag relatedTag = null;
        for(Tag tag : Tag.find.all()) {
            if(tagRelated.equals(tag.getName())) {
                relatedTag = new RelatedTag(tag.getId(), relation, relatedNotes);
            }
        }
        return relatedTag;
    }

    public static Tag findTag(int id) {
        for(Tag tag : Tag.find.all()) {
            if(id == tag.getId())
                return tag;
        }
        return null;
    }

}

运行此命令(在其中更新Tag)时,会发生错误.

When I run this (in which I update a Tag), the error happens.

private static void reciprocate(Tag tag) {
            List<Tag> peers = new ArrayList<Tag>();

            for (RelatedTag rt : tag.getRelatedTags()) {
                if(rt.getRelationship().equals("peer"))
                    peers.add(RelatedTag.findTag(rt.getId()));
            }

        for(RelatedTag rt : tag.getRelatedTags()) {
            int relTemp = 0;
            String relation = new String();
            if (rt.getRelationship().equals("parent"))
                relTemp = 1;
            if (rt.getRelationship().equals("child"))
                relTemp = 2;
            if (rt.getRelationship().equals("peer"))
                relTemp = 3;
            switch(relTemp) {
                case 1: relation = "child"; break;
                case 2: relation = "parent"; break;
                case 3: relation = "peer"; break;
            }

            Tag related = new Tag();
            related = Tag.find.byId(RelatedTag.findTag(rt.getId()).getId());
            List<RelatedTag> available = new ArrayList<RelatedTag>();
            List<String> availableName = new ArrayList<String>();
            for (RelatedTag rt2 : related.getRelatedTags()) {
                availableName.add(RelatedTag.findTag(rt2.getId()).getName());
            }
            if(availableName.contains(tag.getName())) {
                for(RelatedTag rt2 : related.getRelatedTags()) {
                    if(!RelatedTag.findTag(rt2.getId()).getName().equals(tag.getName())) {
                        available.add(rt2);
                    }
                }
            }
            available.add(RelatedTag.findByLabel(
                    tag.getName(), relation,
                    rt.getRelatedNotes()));
            related.setRelatedTags(available);
            related.update(related.getId());    //HERE
        }
}

请帮助我解决这个问题.迭代第一个rt后,将发生错误,但会保存其相关标签.非常感谢.

Please help me figure this out. After the first rt has been iterated, there goes the error but it saves its related tag. Thank you very much.

推荐答案

您的方法RelatedTag#findByLabel始终使用Tag类的ID创建新的RelatedTag.如果您有2个相关标签用于同一标签,则会产生2个具有相同ID的相关标签.

Your method RelatedTag#findByLabel always creates new RelatedTags with the IDs of the Tag class; if you have 2 related tags for the same tag, it will produce 2 related tags with the same ID.

查看 @GeneratedValue EntityManager#createQuery

这篇关于PersistenceException:更新对象时执行DML bindLog错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 03:45