2017-02-27 7 views
0

私は現在、JSF/Primefacesで注文/記事のCRUDアプリケーションを実装しようとしています。エンティティの2つのバージョンを同時に保存する

新しいバージョンの記事を作成するたびに、古いエンティティを別のステータスにマージし、新しいIDでフォーム入力によって読み込まれた新しいエンティティを保存します。

この

条とオーダーラインとの間の関係である: enter image description here

条エンティティは、以下のフィールドがあります。

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を設定しようとしていますが、それは動作しないようです。

答えて

0

orderLineCollectionでカスケードを削除する必要があります。 記事を保持すると、既存のorderLinesの複製が常に得られます。

ArticleとOrderLineの双方向関係も削除することを検討してください。通常は、OrderLineからArticleへの単方向関係のみが必要です。記事のすべてのOrderLinesが必要な場合は、NamedQueryを使用できます。

+0

ありがとうございます!問題を解決した関係を削除する – Tim

関連する問題