【问题标题】:Persistence a child object with existing parent one用现有的父对象持久化一个子对象
【发布时间】:2011-07-25 23:49:45
【问题描述】:

假设有两个具有多对一关系的实体:

@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   
}

作为业务流程的一部分,我拥有现有 A 对象的代码值,我需要插入新的 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, code)”这一行。这对我来说看起来像是一个冗余查询,因为 B 表包含一个外键(acode)。 为了提高性能,我尝试使用现有代码值创建一个对象:

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

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

【问题讨论】:

    标签: hibernate jpa jpa-2.0 hibernate-mapping


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这正是我想要的
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2011-05-15
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多