PersistenceException:ERROR在更新对象时执行DML bindLog

时间:2014-06-08 07:47:16

标签: sql database jpa ebean

美好的一天!我有两个对象:TagRelatedTagTag可以有多个RelatedTag s(也是Tag)。保存Tag及其相关标签可以正常工作。但是当我更新Tag时,它会出错

[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)时,会发生错误。

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之后,会出现错误,但会保存其相关标记。非常感谢你。

1 个答案:

答案 0 :(得分:0)

您的方法RelatedTag#findByLabel始终使用Tag类的ID创建新的RelatedTags;如果您有相同标签的2个相关标签,它将生成2个具有相同ID的相关标签。

查看@GeneratedValueEntityManager#createQuery