问题描述
|
我有以下情况(在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的行为将符合您的预期。