我对图书列表(用户内部)+常用的 getter/setter 进行了以下映射:
@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinColumn(name = "book_id", nullable = false)
@IndexColumn(name = "order", nullable = false)
private List<Book> books = new ArrayList<Book>();
现在我正在为拥有两本书的用户执行此操作:
User user = getUser(...);
user.getBooks().remove(1); //Remove the last one
user.getBooks().add(new Book("New one!"));
update(user); // ends up calling session.merge()
然而,虽然新书被保留,但另一本书并没有被删除。这是之前/之后的数据库:
id | book_id | title | order
------+---------+--------+-------
20 | 1 | Book 1 | 0
21 | 1 | Book 2 | 1
id | book_id | title | order
------+---------+----------+-------
20 | 1 | Book 1 | 0
21 | 1 | Book 2 | 1
22 | 1 | New one! | 1
如您所见,索引列获得了重复项。
这只发生在使用有序/索引集合时。如果我删除 @IndexColumn
注释,该代码段将按预期工作。但是我需要保留插入顺序。我正在使用 Hibernate 3.5.6。
有什么想法吗?提前致谢。
更新:如果我删除第一个元素而不是第二个元素,它就会得到正确的管理。
第二次更新:似乎将 DAO 层更改为使用“saveOrUpdate”而不是“merge”可以使此功能正常工作。但这不是一个解决方案,因为更改可能会破坏现有的遗留代码。
最佳答案
仅仅从集合中删除一个元素只能与orphanRemoval
结合使用在您的数据库上 - 当您想明确执行此操作时,请使用例如删除该书您的实体经理:
Book book = user.getBooks().get(1);
entityManager.remove(book);
关于java - Hibernate:在有序列表中删除后插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33148219/