java - Hibernate 对具有复合键的子实体执行错误的插入顺序

标签 java hibernate jpa orm

我有一个依赖于插入顺序的表(我无法更改的糟糕的遗留设计)并且以错误的顺序插入 transient 实体。有问题的表称为“平均值”,它是“信念”的子实体。当 session.save(belief); 被调用时,该操作被级联到子均值实体,这些实体作为列表存储在信念类中。 Mean 实体以适当的顺序存储在 belief.getMeans() 列表中,但是一旦持久化到数据库中,它们就会按照其复合键的顺序插入。例如,如果有 3 个 Mean 实体要按以下顺序和复合键插入:

[1, 1], [1, 3], [1, 2]

它们将按照复合键的顺序插入,如下所示:

[1, 1], [1, 2], [1, 3]

知道是什么原因造成的吗?我认为 Hibernate 应该根据它们在列表中出现的顺序插入? 我什至尝试在每个 Mean 实体上单独运行 session.save() 以查看这是否会有所作为,但没有。

感谢您的帮助!

编辑:所以我最后做的是在 Mean 表中添加一个名为 col_index 的新列,它在结果矩阵中保存 Mean 的列索引。我将 javax.persistence.OrderBy 注释与新的 col_index 列一起使用,因此平均实体列表以适当的顺序返回。虽然,这仍然不能解决插入顺序问题,但我仍然想得到一个答案。但是就目前而言,这个解决方案已经足够了。

最佳答案

我认为你应该使用 @OrderColumn而不是 @OrderBy .

@OrderBy 注释在获取 Collection 元素时使用,但顺序不由 Hibernate 维护。

@OrderColumn allows Hibernate将元素集合索引持久化到指定的顺序列中,然后在获取集合时使用。

关于java - Hibernate 对具有复合键的子实体执行错误的插入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30181867/

相关文章:

java - 在序列化之前实例化 LAZY 关系

使用 Hibernate、Quartz 和 JavaMail 的应用程序中的 Java OutOfMemory

java - 在 java.awt.event 包中混淆使用适配器模式并违反接口(interface)隔离原则 (ISP)

java - JpaRepository 不返回任何我的自定义查询

java - Intellij IDEA Hibernate 控制台找不到 JDBC 驱动程序

java - 使用 Hibernate 3.6.3 时获取 ClassNotFoundException 并且刚刚在 Tomcat 中添加了 DefaultPreUpdateEventListener

java - 无法在 JPA @Entity 类中声明 List 属性。它说 'Basic' 属性类型不应该是容器

java - 在多个层次依赖关系中模拟对象时是否有难闻的气味?

Java:使用带定时器的信号量

hibernate - 如何在Hibernate> = 4.3中使用Atomikos Transaction Essentials