JPA更新实体之间的关系

时间:2011-06-28 16:44:27

标签: jsf jpa relationship

Hieveryone,我有2个实体类,称为Category和Product,它们是oneToMany的关系。

当我将具有给定类别的新产品添加到数据库中时,类别方面不会使用新产品进行更新。因此categoryList仍然保留旧产品。

我在JPA 2中使用JSF2.0。

产品实体:

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找到正确的组合:)

2 个答案:

答案 0 :(得分:4)

开发人员()有责任在会话中维护双向关系的双方。 JPA只考虑拥有该关系的一方来决定必须更新的内容。拥有方是没有 mappedBy属性的一方。

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

答案 1 :(得分: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类,就像类的责任意义上的设计问题一样......? 并且......如果我使用Hibernate,应该自动维护关系吗? (这可能是属性&lt; ... .Inverse =“true”&gt;?)