database - One To Many and Duplicate entry -
i use jpa->hibernate. playframework. want have relationship.
category - 1:n -> tag
every category can have many tags, tags not know it.
so, this:
@entity public class category ... { @onetomany public list<tag> tags = new linkedlist<tag>(); }
i have test:
@test public void playwithtags() {
tag tag1 = new tag("tag1").save(); // managed playframework category cat1 = new category("cat1"); cat1.tags.add(tag1); cat1.save(); // check if tag1 , cat1 saved assertequals(1, tag.count()); assertequals(1, category.count()); category cat2 = new category("cat2"); cat2.tags.add(tag1); cat2.save(); }
the result is:
16:18:01,555 error ~ duplicate entry '1' key 'tags_id' 16:18:01,555 error ~ not synchronize database state session org.hibernate.exception.constraintviolationexception: not execute jdbc batch update @ org.hibernate.exception.sqlstateconverter.convert(sqlstateconverter.java:96) @ org.hibernate.exception.jdbcexceptionhelper.convert(jdbcexceptionhelp .... java:908) @ java.lang.thread.run(thread.java:619) caused by: java.sql.batchupdateexception: duplicate entry '1' key 'tags_id' @ com.mysql.jdbc.preparedstatement.executebatchserially(preparedstatement.java:2020)
it seems cat2.save() try more should
if if use merge() instead of save() works good:
cat2.merge();
but why?
you're mixing 2 concepts: primary key , foreign key.
there can 1 pk fk means "there must element id in other table". fk doesn't constrain uniqueness.
[edit] problem you're mixing entities. how did tag1
returned save()
?
this entity must 1 hibernate, not result new
. if looks insane, must in save()
:
session.save(tag); return session.load(tag.getid());
this way, entity managed hibernate. when entity managed hibernate, hibernate knows when has save entity , when has been saved.
so when cat2.tags.add(tag1);
in example above, hibernate thinks "oh, don't know tag, must new one".
and tries save tag again.
Comments
Post a Comment