使用EcliplseLink JPA如何在持久化对象时禁用所有关系查找?

时间:2012-02-22 18:39:49

标签: 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);


//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绑定到作为B的实例的A的字段。

我不希望Eclipselink将此开销添加到插入中,因为数据库将在插入之前进行此验证,并且在这种情况下我不需要实际的B实例。

感谢任何回复,谢谢!

3 个答案:

答案 0 :(得分:3)

使用getReference可能是最好的。您还可以在描述符上自定义您的DoesExist策略(@ExistenceChecking(ASSUME_EXISTENCE))。

答案 1 :(得分:2)

这通常是EntityManager.getReference()方法的作用:它创建并向具有给定类和ID的实体返回代理,而不会访问数据库:

A a = new A();
B b = em.getReference(B.class, bId);
a.setB(b);

我没有使用EclipseLink的经验,所以我不知道这个查询到底是什么时候执行的。

答案 2 :(得分:1)

A< - >上的级联注释B关系确定额外的呼叫。可能你有CascadeType.ALL,你想要的只是CascadeType.REFRESH和CascadeType.REMOVE。