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

问题描述

| 我有以下情况(在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进行选择呢?有什么方法可以防止这种行为?     

解决方法

        您不需要(实际上不应该)手动实例化Y。您可以对此进行变型(取决于您的配置)
Y y = (Y) session.load(Y.class,pk);
这不会从数据库中检索Y,而是加载仅由您提到的pk组成的代理。 然后,将y分配给x,并持久保留x的行为将符合您的预期。