2011-06-28 10 views
1

私はエンティティクラスが2つあり、CategoryとProductはoneToMany関係です。JPAのエンティティ間の更新関係

特定のカテゴリの新しい製品をデータベースに追加すると、カテゴリ側は新製品で更新されません。したがって、categoryListはまだ古い製品を保持しています。

私はJPAとJSF2.0を使用しています。2.

Productエンティティ:

public class Product implements Serializable { 
    @ManyToOne 
    private Category category; 
    //getters::setters 

カテゴリーエンティティ:

public class Category implements Serializable { 
    @OneToMany(mappedBy = "category") 
    private List<Product> productList; 

ProductControllerクラス:

public ProductController { 
     @EJB 
     private ProductService productService; 
     private Category category; 
     private Product product; 
     //getters::setters 

    //actionMethod called by JSFpage. 
    public String addProduct(){ 

     product.setCategory(category); 

     productService.add(product); 
     return "productPage.xhtml";  
    }} 

この方法私は何も見ることができないカテゴリ側の更新。 私はこの問題の解決策を見つけました。以下に示すように、私は

public ProductController { 
      @EJB 
      private ProductService productService; 
      @EJB 
      private CategoryService categoryService; 
      private Category category; 
      private Product product; 
      //getters::setters 

     //actionMethod called by JSFpage. 
     public String addProduct(){ 

      product.setCategory(category);  
      productService.add(product); 

      // update category with new product 
      category.getProductList().add(product); 
      categoryService.update(category); 

      return "productPage.xhtml";  
     }} 

...カテゴリが更新されます。この道をProductController内のコードを変更しかし、私はそれは開発者の責任(あなただtは右の組み合わせ:)

答えて

4

を見つけるt want CategoryService in my ProductController. How to implement this? i have tried with Cascade.ALL/REFRESH... but i think i couldnを着用します)を使用して、セッション内で双方向関係の両側を維持します。 JPAは、更新する必要があるものを決定するために関係を所有する側のみを考慮に入れます。所有側は、なしmappedBy属性のある側です。

したがって、カテゴリを製品に設定するだけで、JPAがデータベースに新しい製品を挿入し、カテゴリにリンクすることができます(製品が所有側であるため)。しかし、逆の関係はJPAによって自動的に更新されません。手動で行う必要があります。カテゴリオブジェクトを破棄してデータベースからリロードすると、カテゴリの製品リストの中に新しい製品が置かれます。

0

I undestand。私は正しいコードをProductServiceに置き換えました。ProductontrollerクラスはCategoryについて何も知らない。

@Stateless 
@LocalBean 
public class ProductService implements ProductServiceInterface { 

@EJB 
private ProductFacade ejbFacade; 

@EJB 
CategoryService categoryService; 

@Override 
public Product add(Product product) {  
    ejbFacade.create(product); 

    /** Create bidirectional relationship */ 
    Category category = product.getCategory(); 
    category.getProductList().add(product); 
    categoryService.update(category); 

    return product; 
} 

}

しかし、どのようにあなたはJPA /?とJSFを使用する場合は/どの層にこのような関係を維持するには? ... 私は今、ProductServiceクラスのCategoryServiceクラスが、クラスの責任という意味でのデザイン問題を好んでいますか? ... Hibernateを使用した場合、リレーションシップは自動的に維持されるはずですか?

(...。逆=」true」を>?属性<と、この可能です)
関連する問題