Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止插入时不必要的选择?_Java_Hibernate_Many To One - Fatal编程技术网

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

Java 如何防止插入时不必要的选择?,java,hibernate,many-to-one,Java,Hibernate,Many To One,我有以下场景(在Java/Hibernate中): 我有两个实体类:X和Y。X与Y有一个@manytone关联,它不是级联的 我创建了x的(非托管)实例x和y的(非托管)实例y,并在x中填充对y的引用。y中唯一填充的字段是主键 实体y在基础数据库中已具有相应的行,但实体x是新的 我坚持实体x 当我执行这个场景时,我希望看到一个查询:insertx。但是,实际情况是Hibernate执行两个查询: 选择y 插入x 此外,我还注意到,在持久化x之后,对y的引用实际上并没有被管理,会话中也没有

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

  • 我有两个实体类:X和Y。X与Y有一个@manytone关联,它不是级联的
  • 我创建了x的(非托管)实例x和y的(非托管)实例y,并在x中填充对y的引用。y中唯一填充的字段是主键
  • 实体y在基础数据库中已具有相应的行,但实体x是新的
  • 我坚持实体x
当我执行这个场景时,我希望看到一个查询:insertx。但是,实际情况是Hibernate执行两个查询:

  • 选择y
  • 插入x
此外,我还注意到,在持久化x之后,对y的引用实际上并没有被管理,会话中也没有y的实例!那么,为什么要在y上执行选择呢?有没有办法防止这种行为?

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

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


然后将y指定给x,并保持x将按您预期的方式运行。

很好,效果很好!关于我问题的另一部分,你有什么想法吗:在我的场景中,为什么Hibernate在y上进行选择?我想了想,但没有确定的答案。我的猜测是,由于您手动创建实例,它是一个分离的对象(不是由hibernate持久性上下文管理的对象),因此hibernate需要检查它是否确实存在于数据库中。但我不确定,因为即使它不存在,db也会抛出一个外键限制错误,插入也会阻止它。简而言之,我不知道:)
Y y = (Y) session.load(Y.class, pk);