2011-06-28 211 views
1

Hieveryone,我有2个实体类,称为类别和产品,这是一对多的关系。JPA更新实体关系

当我向数据库中添加一个给定类别的新产品时,类别面不会更新新产品。因此categoryList仍然保留旧产品。

我使用JSF2.0与JPA 2

产品实体:

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";  
    }} 

这样我什么也看不见更新类别方面。 所以我找到了解决这个问题的方法。我改变了ProductController的代码如下图所示...

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";  
     }} 

这样类别的更新,但我不t want CategoryService in my ProductController. How to implement this? i have tried with Cascade.ALL/REFRESH... but i think i couldn吨找到正确的组合:)

回答

4

这是开发商的责任( )在会话内维护双向关系的双方。 JPA只会考虑拥有关系的一方来决定哪些内容需要更新。拥有方是mappedBy属性。

因此,在您的示例中,将类别设置为产品足以让JPA在数据库中插入新产品并将其链接到类别(因为产品是拥有方)。但是反向关系不会由JPA自动更新。你必须手动完成。如果您放弃类别对象并从数据库中重新加载它,则会在该类别的产品列表中找到新产品。

0

我不忍。我已将正确的代码替换为ProductService.So 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类喜欢类的责任意义上的设计问题...? And ...如果我使用Hibernate,应该自动维护关系吗? (这是可能的属性< ...。逆=“true”>?)