sql - PersistenceException: ERROR executing DML bindLog when Updating an Object -
good day! have 2 objects: tag
, relatedtag
. tag
can have many relatedtag
s (which tag
). saving tag
related tags works fine. when update tag
, has 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 related_tag (id, tag_id, relationship, related_notes) values (?,?,?,?) [23505-172]]]
here tag
model:
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 entity, specifying entity id } public static boolean exists(tag newtag) { for(tag alltags : tag.find.all()) { if(alltags.getname().equals(newtag.getname())) return true; } return false; } }
and here relatedtag
model:
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; } }
when run (in update tag
), error happens.
private static void reciprocate(tag tag) { list<tag> peers = new arraylist<tag>(); (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>(); (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 } }
please me figure out. after first rt
has been iterated, there goes error saves related tag. thank much.
your method relatedtag#findbylabel
creates new relatedtags ids of tag class; if have 2 related tags same tag, produce 2 related tags same id.
look @generatedvalue , entitymanager#createquery
.
Comments
Post a Comment