Java 使用EcliplseLink JPA如何在持久化对象时禁用所有关系查找?
当我使用外键持久化一个对象时,我在日志中看到eclipselink会关闭并执行验证查询,如下所示: 我还看到eclipselink找到这个对象并将其绑定。我不想让它做这两件事 基本上,我试图保存对象A,而A与对象B有关系。当我插入一个新的A时,我所拥有的只是B的ID,而不是类B的实例,在这种情况下,我对获取B的实例不感兴趣 大概是这样的:Java 使用EcliplseLink JPA如何在持久化对象时禁用所有关系查找?,java,jpa,eclipselink,Java,Jpa,Eclipselink,当我使用外键持久化一个对象时,我在日志中看到eclipselink会关闭并执行验证查询,如下所示: 我还看到eclipselink找到这个对象并将其绑定。我不想让它做这两件事 基本上,我试图保存对象A,而A与对象B有关系。当我插入一个新的A时,我所拥有的只是B的ID,而不是类B的实例,在这种情况下,我对获取B的实例不感兴趣 大概是这样的: String b_id = "12345"; A a = new A(); B b = new B(); b.setId(b_id); a.setB(b);
String b_id = "12345";
A a = new A();
B b = new B();
b.setId(b_id);
a.setB(b);
//begin tran
try {
em.persist(a);
//commit
} catch (Exception e) {
e.printStackTrace();
//rollback
}
这导致日志中出现以下情况:
Execute query DoesExistQuery(referenceClass=B)
SELECT ID FROM B WHERE (ID = ?)
bind => [12345]
现在我想在不使用Eclipselink的情况下插入A来验证是否存在具有此Id的B,并且我不希望它将此B绑定到A的字段,该字段是B的实例
我不希望Eclipselink将此开销添加到插入中,因为数据库将在插入之前进行此验证,在这种情况下,我不需要实际的B实例
感谢您的回复 这通常是该方法的角色:它创建并返回一个代理给具有给定类和ID的实体,而不命中数据库:
A a = new A();
B b = em.getReference(B.class, bId);
a.setB(b);
我没有EclipseLink的经验,所以我不知道这个查询是什么时候执行的 这通常是该方法的角色:它创建并返回一个代理给具有给定类和ID的实体,而不命中数据库:
A a = new A();
B b = em.getReference(B.class, bId);
a.setB(b);
我没有EclipseLink的经验,所以我不知道这个查询是什么时候执行的 B关系上的级联注释确定了该额外调用。可能您有CascadeType.ALL,您需要的是CascadeType.REFRESH和CascadeType.REMOVE only B关系上的级联注释确定了该额外调用。可能您有CascadeType.ALL,您需要的是CascadeType.REFRESH和CascadeType.REMOVE only 使用getReference可能是最好的。您还可以在描述符@existencecheckingsuccess\u EXISTENCE上自定义您的性别歧视策略。使用getReference可能是最好的选择。您还可以在描述符@existencecheckingsuccessive\u EXISTENCE上自定义您的性别歧视政策。这似乎奏效了!我仍然在日志中看到select和bind,但我不再看到Execute query DOESDISTQUERY,因此我假设我们处于清除状态。谢谢这似乎奏效了!我仍然在日志中看到select和bind,但我不再看到Execute query DOESDISTQUERY,因此我假设我们处于清除状态。谢谢