Hibernate会话的细微差别

时间:2017-07-13 16:17:35

标签: java sql database spring hibernate

我的问题是关于hibernate-所以说你有两个对象正在排队以保存到你的数据库。这些对象对于每个字段具有完全相同的值。我的hibernate配置为在50次查询后自动刷新,所以让我们假设在通过hibernate会话后它不会立即将这些对象刷新到数据库。 hibernate会将每个对象作为不同的实体保存到数据库中(因此它会将重复的记录保存为“不同的”记录),或者它是否认识到这些对象具有完全相同的值并且只保存这些镜像对象的一个​​实例数据库?

2 个答案:

答案 0 :(得分:0)

最终是否在数据库中使用一个或两个实体取决于equals()(和hashcode)的实现。如果对象被认为是平等的,那么你最终会得到一个实体,但如果不是,你最终会有两个实体。

使用自动生成的代理键时必须格外小心:在第一次保存对象之前,尚未分配键。因此,任何equals()实现都不能依赖于键的相等性。您必须确保处理这种特殊情况

答案 1 :(得分:0)

  

我的问题是关于休眠 - 所以说你有两个对象   你排队等候保存到你的数据库。

让我们改写一下 - 我们想要在数据库中保留两个实体。

  

这些对象对每个字段都具有完全相同的值。

在Java中,Sub test() Dim stuff As Variant, subsets As Variant Dim i As Long stuff = Array("a", "b", "c", "d") subsets = PowerSet(stuff) For i = LBound(subsets) To UBound(subsets) Cells(i + 1, 1).Value = "{" & Join(subsets(i), ",") & "}" Next i End Sub (和equals)实现了一个对象标识。在数据库中有行标识 - 主键,用于标识唯一行(转换为唯一实例)。由于我们将实体的实例映射到表中的行,因此区分同一类(同一实体)的两个实例的方法是为每个实例提供唯一的主键。在JPA(Hibernate是JPA的实现)中,您需要使用hashcode注释来注释字段(Entity的属性),这样它可以被唯一标识。

下面的类是具有唯一ID的实体类。

@Id

您可以在每次持久时提供唯一ID,也可以使用@Entity public MyClass @Id @GeneratedValue private Long id; 自动生成。根据底层数据库有不同的生成策略。