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

标签 java hibernate collections

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

相关文章:

java - 多线程 Android 应用程序中的组件应该如何交互?

java - 如何从有序列表中选择随机起始位置?

java - 如何提高Jboss 使用的内存量?

java - 使用 Maven、Tomcat 7 和 Websocket 构建可执行的 War/Jar

java - 诱惑报告: Failed test written with Citrus displayed as ‘Broken’

java - 如何自动删除子实体?

java - Hibernate 从控制台记录异常

java - 使用 LocalContainerEntityManagerFactoryBean 创建 session ?

java - 使用 Guava 将列表转换并转换为集合

java - 使用构建器定义不可变映射的类型