Когда у меня есть сущность со связями, я не знаю, какой лучший способ сохранить изменения в БД.
Вот упрощенная сущность.Пожалуйста, учтите, что я внес небольшие изменения в код, чтобы опубликовать его здесь, и я мог внести некоторые ошибки.
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, поэтому транзакции и entityManagers управляются контейнером.
В то время у меня есть отсоединенный (терминология JPA) экземпляр Permessitemporanei в памяти.Я должен сохранить следующие изменения в базе данных: 1- должно быть удалено связанное ingressiconpermesso 2 - должно быть создано новое ingressiconpermesso 3 - поле statopermesso должно быть обновлено 4 - новое Accessiconpermesso должно быть добавлено в коллекцию accessiconpermessoCollection
Какой лучший способ сделать это?Возможно, я могу сделать все необходимые изменения в экземпляре Permessitemporanei и объединить его, но у меня было много проблем с этим, и я начал думать, что это не правильная сторона отношений, чтобы продолжать изменения.Для меня более естественно сохранять объект за раз, поэтому исключая все эти каскад = CascadeType.ALL.
Предположим, мой экземпляр Permessitemporanei называется 'permesso';мой код выглядит примерно так:
- getEntityManager (). remove (permesso.ingressiconpermesso);
- getEntityManager (). persist (новый Ingressiconpermesso);
- getEntityManager (). merge (permesso) // как только его поле statopermesso было обновлено;
- getEntityManager (). perist (новый Accessiconpermesso);
Очевидно, таким образом я долженвручную добавьте в память «permesso» все изменения, которые я внес в базу данных.
Есть ли лучший подход?
Кстати, все отношения JPA, которые я видел, являются двунаправленными.Могу ли я сделать их однонаправленными?Другими словами, можно ли безопасно удалить код:
@ OneToMany (cascade = CascadeType.ALL, mappedBy = "iDpermesso") частная коллекция accessiconpermessoCollection;
из объекта Permessitemporanei, сохранив его насубъект Accessiconpermesso или я нарушаю JPA?
Спасибо, Филиппо