私は現在、JSF/Primefacesで注文/記事のCRUDアプリケーションを実装しようとしています。エンティティの2つのバージョンを同時に保存する
新しいバージョンの記事を作成するたびに、古いエンティティを別のステータスにマージし、新しいIDでフォーム入力によって読み込まれた新しいエンティティを保存します。
この
条とオーダーラインとの間の関係である:条エンティティは、以下のフィールドがあります。
public void edit(Article article) throws OptimisticLockException {
/* PK des Auftrags/der Auftragsposition speichern um die Suche zu vereinfachen */
int articleID = article.getArticleID();
/**
*
* Falls sich article im Zustand "detached" befindet, werden in
* attachedArticle die aktuellen Daten aus der DB geladen.
*
* Falls sich orderLine im Zustand "managed" befindet, werden in
* attachedOrderLine die Daten aus dem PersistenceContext geladen. Dies
* ist notwendig, da nur Datensätze für Entities gesperrt werden können
* die sich im Zustand "managed" befinden.
*
*/
Article attachedArticle = em.find(Article.class, articleID, LockModeType.OPTIMISTIC);
/* Prüfen ob der Artikel noch in der Datenbank vorhanden ist */
if (attachedArticle != null) {
/* Laden des aktuellsten Datensatzes aus der Datenbank */
Article latestVersionArticle = findLatestVersion(articleID);
/* Anhand der Version wird geprüft ob die bearbeiteten Daten noch konsistent mit dem Zustand der Datenbank sind */
if (latestVersionArticle.getVersion() == article.getVersion()) {
/**
* Schreibt den bearbeiteten Artikel zurück in die Datenbank,
* Versionsnummer wird am Ende der Transaktion automatisch
* inkrementiert (optimistische Sperre)
*/
latestVersionArticle.setArticleStatus(ArticleStatus.GESPERRT);
em.merge(latestVersionArticle);
/**
* Erstellt einen neuen Artikel mit den eingegebenen Daten und
* dem Status Freigegeben.
*/
article.setArticleStatus(ArticleStatus.FREIGEGEBEN);
article.setOrderLineCollection(null);
em.persist(article);
} else {
/* OptimisticLockException werfen falls die Daten des Auftrags nicht mehr konsistent sind */
throw new OptimisticLockException(article);
}
} else {
throw new OptimisticLockException(article);
}
}
:これは、更新が/新しいエンティティを節約する方法である
を
@OneToMany(cascade = CascadeType.ALL, mappedBy = "fkArticleID")
@XmlTransient
private Collection<OrderLine> orderLineCollection;
最初はすべてうまくいくようですが、新しいバージョンの記事は自動的にanoを作成するようです既存のOrderに現れるOrderLineです。新しいバージョンが作成されている間に記事を「更新」するたびに、別のOrderLineも作成されています。Article-Entityの@OneToManyフィールドに不具合があると思われます..私は永続化する前にnullにorderLineCollectionを設定しようとしていますが、それは動作しないようです。
ありがとうございます!問題を解決した関係を削除する – Tim