如何防止插入时不必要的选择?

Rub*_*ick 5 java hibernate many-to-one

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

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

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

  • 选择y
  • INSERT x

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

Sel*_*ber 3

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

Y y = (Y) session.load(Y.class, pk);
Run Code Online (Sandbox Code Playgroud)

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

然后将 y 分配给 x,并保留 x 将按照您的预期运行。