我使用JPA-> Hibernate。 PlayFramework。我想要有關係。一對多和重複條目
Category - 1:n -> Tag
每個類別都可以有很多標籤,但標籤不知道它。
所以,我這樣做:
@Entity public class Category ... { @OneToMany public List<Tag> tags = new LinkedList<Tag>(); }
我有測試:
@Test 公共無效playWithTags(){
Tag tag1 = new Tag("tag1").save(); // managed by playframework
Category cat1 = new Category("cat1");
cat1.tags.add(tag1);
cat1.save();
// check if tag1 and cat1 were saved
assertEquals(1, Tag.count());
assertEquals(1, Category.count());
Category cat2 = new Category("cat2");
cat2.tags.add(tag1);
cat2.save();
}
結果是:
16:18:01,555 ERROR ~ Duplicate entry '1' for key 'tags_id'
16:18:01,555 ERROR ~ Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelp
....
java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.BatchUpdateException: Duplicate entry '1' for key 'tags_id'
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
似乎cat2.save()嘗試做多,那麼它應該
如果如果用合併(),而不是保存()它的工作原理好:
cat2.merge();
但爲什麼呢?
是的。但我的錯誤是:無法添加或更新子行:外鍵約束失敗..... FOREIGN KEY('tags_id')引用'標記('id')' – ses 2011-04-29 13:07:39
錯誤表示標記未寫入TAB表格。添加標籤後您是否正確提交?如果您運行普通的SQL查詢,是否可以從數據庫中讀取標籤? – 2011-04-29 16:06:08
Tag tag1 =新的Tag(「tag1」)。save();這由PlayFramework管理。當它在這裏返回tag1時,它已經由hibernate管理 - 它具有id,與session等綁定在一起。不,他不認爲'這一定是新的'。不應該 - 因爲tag1保存並通過play的save()返回。 – ses 2011-04-29 21:08:06