我在J2SE项目中使用JPA + Hibernate和PostGre SQL数据库
我有2个实体 A 和 B 。 A 与 B 有@OneToMany关系。
在我的域模型中, A 可能会引用数百万 B 。当我向集合添加新对象时,需要几分钟才能完成。
@OneToMany(cascade=CascadeType.PERSIST)
Collection<B> foo = new ArrayList<B>(); // might contain millions of records
//...
// this takes a lot of time
foo.add(new B());
我认为JPA在插入新对象之前会抓取整个集合。 是否有可能配置关系,以便通过向集合中添加新对象而不执行获取操作?
答案 0 :(得分:4)
@OneToMany关系是延迟加载的。这意味着对foo的任何调用都将导致JPA加载数据库中引用的所有条目。
我知道避免这种情况的唯一方法是扭转你的关系,并在B上定义一个@ManyToOne关系(指向A)。这样,您就没有需要加载的集合来在数据库中插入新对象。
以下是代码示例:
public class B {
@ManyToOne
private A a;
public void foo() {
A a = new A();
B b = new B();
b.setA(a); // Instead of a.getFoo().add(b);
// Persist b in database...
}
}
答案 1 :(得分:1)
改为使用属性访问
@OneToMany(cascade=CascadeType.PERSIST)
public Collection<B> getFoo() {
return foo;
}
JPA实现使用代理。但它在使用属性访问策略时才有效