5

我有以下场景(在 Java / Hibernate 中):

  • 我有两个实体类:X 和 Y。X 与未级联的 Y 有一个 @ManyToOne 关联。
  • 我创建了一个 X 的(非托管)实例 x 和一个 Y 的(非托管)实例 y,并在 x 中填充了对 y 的引用。y 中唯一填充的字段是主键。
  • 实体 y 在底层数据库中已经有对应的行,但实体 x 是新的。
  • 我坚持实体 x。

当我执行这个场景时,我希望看到一个查询:INSERT x。然而,实际发生的是 Hibernate 执行了两个查询:

  • 选择 y
  • 插入 x

此外,我还注意到,在 x 的持久化之后,对 y 的引用实际上并没有成为托管的,并且会话中没有 Y 的实例!那么,为什么要执行 y 上的 SELECT 呢?有没有办法防止这种行为?

4

1 回答 1

3

您不需要(实际上您不应该)手动实例化 Y 。您可以对此进行变体(取决于您的配置)

Y y = (Y) session.load(Y.class, pk);

这不会从数据库中检索 Y,而是加载仅由您提到的 pk 组成的代理。

然后将 y 分配给 x,并且持久化 x 的行为会如您所愿。

于 2011-06-30T14:15:28.220 回答