JPA: возможно ли сохранить дочерние объекты в массиве только тогда, когда основной объект сохраняется? - PullRequest
0 голосов
/ 31 декабря 2011

Я занимаюсь разработкой веб-приложения с использованием JSF и JPA (ссылка на Eclipse). У меня есть две сущности с двунаправленными отношениями OneToMany. Объект-владелец - это контакт, а целевой объект - клиент. Один клиент может иметь несколько контактов, таких как электронная почта, телефон и т. Д. Когда конечный пользователь добавляет нового клиента, он также сразу добавляет контакты. Необходимо отменить сохранение нового клиента, даже после добавления контактов этому клиенту. Я попытался добавить эту функциональность, но потерпел неудачу следующим образом.

Может ли этот сенарио быть напрямую достигнут постоянством?

Контактное лицо

....
public class Contact implements Serializable {
    ....   
    @ManyToOne
    Customer customer;
    ....   

Клиентский субъект

....
public class Customer implements Serializable {
    ....
    @OneToMany(mappedBy = "customer")
    private List<Contact> contacts;
    ....   

Добавление нового контакта в Customer (текущий объект является объектом класса Customer)

Contact contact = new Contact();
contact.setCustomer(current);
....
current.getInstitutionContacts().add(contact);

Это работает, когда ток уже сохранен. Если я попытался добавить контакт, чтобы сохранить его, есть java.lang.NullPointerException.

Я могу обойти эту функциональность, но есть ли какой-то способ, которым мы можем просто собирать контакты в массив и сохранять их только тогда, когда (и только если) клиент сохраняется? С помощью каскадного сохранения или отложенной выборки и т. Д.?

1 Ответ

0 голосов
/ 01 января 2012

Похоже, вы хотите, чтобы контакты были Компоненты , а не Entities .

Разница в том, что у сущности свой жизненный цикл; он живет за пределами своей ассоциации, и удаление родителя НЕ обязательно должно удалять ребенка. Кроме того, если ребенок является сущностью, другие классы также могут иметь отношения с этим ребенком.

Компоненты полностью связаны с родителем. Они автоматически уходят, если родитель уходит. На них не могут ссылаться другие ассоциации или другие организации. Это как простые свойства родительского класса.

Единственное предостережение в том, что я не знаю, поддерживают ли все реализации JPA набор компонентов.

См. эту документацию . В частности, в той части, которая гласит: «Вы также можете использовать аннотации ассоциации в встраиваемом объекте (например, @OneToOne, @ManyToOne, @OneToMany или @ManyToMany). Чтобы переопределить столбцы ассоциации, вы можете использовать @AssociationOverride.»

Если используемая реализация JPA делает, вы можете использовать аннотацию @Embeddable и @ OneToMany

Редактировать: - Я также нашел информацию здесь http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Collections.

...