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

时间:2011-06-25 09:29:55

标签: 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执行两个查询:

  • SELECT y
  • INSERT x

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

1 个答案:

答案 0 :(得分:2)

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

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

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

然后将y分配给x,并且持久化x将按预期运行。