JPA обновить отношения между сущностями - PullRequest
1 голос
/ 28 июня 2011

Hieveryone, у меня есть 2 класса сущностей, называемых Категория и продукт, которые являются отношением oneToMany.

Когда я добавляю новый продукт с данной категорией в базу данных, сторона категории не обновляется новым продуктом.Таким образом, 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 не могу найти правильную комбинацию:)

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

Разработчик ( вы ) несет ответственность за поддержание двух сторон двунаправленных отношений внутри сеанса.JPA будет принимать во внимание только ту сторону, которая владеет отношениями, чтобы решить, что необходимо обновить.Сторона-владелец - это сторона, где есть атрибут no mappedBy.

Таким образом, в вашем примере, установка категории для продукта достаточна для JPA, чтобы вставить новый продукт в базу данных.и свяжите это с категорией (потому что продукт является владельцем).Но обратные отношения не будут автоматически обновляться JPA.Вы должны сделать это вручную.Если вы отбросите объект категории и перезагрузите его из базы данных, вы найдете новый продукт в списке продуктов категории.

0 голосов
/ 30 июня 2011

Я понимаю.я заменил правильный код в ProductService.So класс Productontroller ничего не знает о категории.

@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?... Я имею в виду, теперь у меня есть класс CategoryService в классе ProductService, как проблема дизайна в смысле ответственности классов ...?И… Должны ли автоматически поддерживаться отношения, если я использую Hibernate?(возможно ли это с атрибутом <…. Inverse = ”true”>?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...