Когда у меня есть объект с отношениями, я не знаю, как лучше всего сохранить изменения в БД.
Вот упрощенная сущность. Пожалуйста, учтите, что я внес небольшие изменения в код, чтобы опубликовать его здесь, и я мог внести некоторые ошибки.
public class Permessitemporanei implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID_permesso")
private Integer iDpermesso;
@Column(name = "Stato_permesso")
private Integer statopermesso;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "iDpermesso")
private Collection<Accessiconpermesso> accessiconpermessoCollection;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "iDpermesso")
private Ingressiconpermesso ingressiconpermesso;
Как видите, он связан с двумя другими объектами отношениями OneToMany и OneToOne. Я использую Glassfish с jta, поэтому транзакции и entityManager управляются контейнером.
В то время у меня есть отдельный (терминология JPA) экземпляр Permessitetemporanei в памяти. Я должен сохранить следующие изменения в базе данных: 1- связанный ingressiconpermesso должен быть удален 2- должен быть создан новый ingressiconpermesso 3- поле statopermesso должно быть обновлено 4- новый Accessiconpermesso должен быть добавлен в коллекцию accessiconpermessoCollection
Каков наилучший способ сделать это? Возможно, я могу внести все необходимые изменения в экземпляр Permessitetemporanei и объединить его, но у меня было много проблем с этим, и я начал думать, что сохранять изменения — неправильная сторона отношений. Для меня более естественно сохранять объект за раз, поэтому исключаются все эти cascade = CascadeType.ALL.
Предположим, что мой экземпляр Permessitetemporanei называется «permesso»; мой код примерно такой:
- getEntityManager().remove(permesso.ingressiconpermesso);
- getEntityManager().persist(новый Ingressiconpermesso);
- getEntityManager().merge(permesso) // после обновления поля statopermesso;
- getEntityManager().perist(новое разрешение Accessicon);
Очевидно, что таким образом я должен вручную обновить «permesso» в памяти со всеми изменениями, которые я сделал в базе данных.
Есть ли лучший подход?
Кстати, все отношения JPA, которые я видел, являются двунаправленными. Могу ли я сделать их однонаправленными? Другими словами, могу ли я безопасно удалить код:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "iDpermesso") доступ к частной коллекцииiconpermessoCollection;
из объекта Permessitetemporanei, сохраняя его в объекте Accessiconpermesso, или я нарушаю JPA?
Спасибо, Филиппо.