我在PGSQL DB上使用JPA / Hibernate。
我的应用程序中有一个实体,每次持久保存第一个实体时,我想要保留另一个实体(不同类型)。例如,每当创建“ORDER”时,我想立即保留一个空的“ORDER_INVOICE”实体并将其连接到订单。它们位于两个不同的表中。
首先,我考虑为ORDER实体编写@PostPersist函数并在其中保留ORDER_INVOICE,但我的问题是我在此上下文中没有实体管理器。
我希望避免记住在每个ORDER持久性上持久化ORDER_INVOICE。
这是正确的方法吗?如果是这样,我如何让EM进入PostPersist?如果没有,那会是更好的方式吗?
答案 0 :(得分:3)
为什么不简单地在主实体的构造函数中创建它,并在关系上设置cascade = persist?
@Entity
public class Order {
@OneToMany(mappedBy = "order", cascade=CascadeType.PERSIST)
private List<Invoice> invoices = new ArrayList<Invoice>();
public Order() {
Invoice i = new Invoice();
i.setOrder(this);
this.invoices.add(i);
}
// ...
}
已编辑:
为避免每次调用Order的构造函数(例如JPA)时创建新发票,您可以使用这种代码:
@Entity
public class Order {
@OneToMany(mappedBy = "order", cascade=CascadeType.PERSIST)
private List<Invoice> invoices = new ArrayList<Invoice>();
/**
* Constructor called by JPA when an entity is loaded from DB
*/
protected Order() {
}
/**
* Factory method; which creates an order and its default invoice
*/
public static Order createOrder() {
Order o = new Order();
Invoice i = new Invoice();
i.setOrder(o);
o.invoices.add(i);
}
// ...
}
如果订单在通过工厂方法实例化后仍然存在,那么发票也将保留(由于级联)。如果订单没有持久化,那么它将在某个时刻被垃圾收集,并且它的默认启用也是。