gpt4 book ai didi

java - Hibernate:在有序列表中删除后插入

转载 作者:行者123 更新时间:2023-11-30 03:13:35 25 4
gpt4 key购买 nike

我对图书列表(用户内部)+常用的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com