gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:03:29 26 4
gpt4 key购买 nike

假设有两个具有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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com