2011-03-30 67 views
3

假设有两个实体具有多对一关系的子对象:持久性与现有父一个

@Entity 
public class A { 
    private long code; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public long getCode() { 
     return code; 
    } 

    public viod setCode(long code) { 
     this.code = code; 
    } 

    // additional setters and getters 
} 

@Entity 
public class B { 
    private long code; 
    private A a; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public long getCode() { 
     return code; 
    } 

    public viod setCode(long code) { 
     this.code = code; 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="acode", nullable=false) 
    public A getA() { 
     return a; 
    } 

    public void setA(A a) { 
     this.a = a 
    } 

    // additional setters and getters 
} 

随着业务流程的一部分,我有现有的目的的代码值,我需要插入新的B对象它涉及到现有A. 此代码工作正常:

// inject em 
A a = em.find(A.class, code); 
B b = new B(); 
b.setA(a); 
em.persist(b); 

我的问题是 “A A = em.find(的A.class,代码)” 行。这看起来像是一个冗余查询,因为B表包含一个外键(acode)。 为了提高性能,我试图创建一个对象与现有的码值:

A a = new A(); 
a.setCode(code); 
B b = new B(); 
b.setA(a); 
em.persist(b); 

,但它不工作。 有什么办法可以避免不必要的查询吗?

回答

5

在这种情况下,有一种特殊的getReference()方法可以用来代替find()。它使用指定的id创建一个代理对象而不会发出queires。当保存B时,使用该ID的A的存在由数据库端的外键约束检查。

A a = em.getReference(A.class, code); 
B b = new B(); 
b.setA(a); 
em.persist(b); 
+0

谢谢,那就是我一直在寻找 – user683560 2011-03-30 11:56:00