JPA:每当创建另一个实体时创建实体

时间:2011-02-28 11:54:29

标签: jpa

我在PGSQL DB上使用JPA / Hibernate。

我的应用程序中有一个实体,每次持久保存第一个实体时,我想要保留另一个实体(不同类型)。例如,每当创建“ORDER”时,我想立即保留一个空的“ORDER_INVOICE”实体并将其连接到订单。它们位于两个不同的表中。

首先,我考虑为ORDER实体编写@PostPersist函数并在其中保留ORDER_INVOICE,但我的问题是我在此上下文中没有实体管理器。

我希望避免记住在每个ORDER持久性上持久化ORDER_INVOICE。

这是正确的方法吗?如果是这样,我如何让EM进入PostPersist?如果没有,那会是更好的方式吗?

1 个答案:

答案 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);
    }

    // ...
}

如果订单在通过工厂方法实例化后仍然存在,那么发票也将保留(由于级联)。如果订单没有持久化,那么它将在某个时刻被垃圾收集,并且它的默认启用也是。