JPA: создание объекта при создании другого объекта - PullRequest
3 голосов
/ 28 февраля 2011

Я использую JPA / Hibernate поверх БД PGSQL.

У меня есть сущность в моем приложении, и я хочу сохранить другую сущность (другого типа) каждый раз, когда сохраняется первая сущность. Например, всякий раз, когда создается «ORDER», я хочу немедленно сохранить пустую сущность «ORDER_INVOICE» и подключить ее к заказу. Они находятся в двух разных таблицах.

Сначала я подумал о написании функции @PostPersist для сущности ORDER и сохранении в ней ORDER_INVOICE, но моя проблема в том, что у меня нет Entity Manager в этом контексте.

Я стараюсь не помнить о сохранении ORDER_INVOICE при каждом сохранении ORDER.

Это правильный путь? Если так, как я могу получить EM в PostPersist? А если нет, то что было бы лучше?

1 Ответ

3 голосов
/ 28 февраля 2011

Почему бы вам просто не создать его в конструкторе вашей главной сущности и не установить для него отношение cascade = persist?выставлять счет каждый раз, когда вызывается конструктор ордера (например, 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);
    }

    // ...
}

Если порядок сохраняется после того, как он был создан методом фабрики, то счетбудет сохраняться также (благодаря каскаду).Если порядок не сохраняется, то в какой-то момент он будет собирать мусор, а также его значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...