hibernate - 将子对象与现有的父对象一起持久化

标签 hibernate jpa jpa-2.0 hibernate-mapping

假设有两个具有ManyToOne关系的实体:

@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);

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

最佳答案

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

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

关于hibernate - 将子对象与现有的父对象一起持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484976/

相关文章:

在一个实体中 hibernate 多个自然 id

java - 映射非规范化 hibernate

java - 正常字段没有类型为 java.lang.String 的合格 bean 异常

java - 在 JPQL 中将 native 查询转换为命名查询

hibernate - 无法在Kotlin和JpaRepository中为嵌套列表对象找到适当的构造函数错误

eclipse - 无法从驱动程序 [null]、用户 [null] 和 URL [null] postgres 获取连接

java - 实体的流动性是什么意思?

java - 如何使用 hibernate JPA 注释映射嵌套集合 Map<Key,List<Values>>?

javax.persistence.PersistenceException : org. hibernate.PersistentObjectException : detached entity passed to persist?

java - JPA+ hibernate : Change of createNativeQuery() + getResultList() behaviour?