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
找到正确的组合:)
答案 0 :(得分:4)
开发人员(你)有责任在会话中维护双向关系的双方。 JPA只考虑拥有该关系的一方来决定必须更新的内容。拥有方是没有 mappedBy
属性的一方。
因此,在您的示例中,将类别设置为产品足以让JPA在数据库中插入新产品并将其链接到类别(因为产品是拥有方)。但JPA不会自动更新反向关系。你必须手动完成。如果您丢弃类别对象并从数据库重新加载它,您将在该类别的产品列表中找到新产品。
答案 1 :(得分:0)
@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;?)