JPA ManyToMany不填充对象属性

时间:2011-09-12 18:52:45

标签: java jpa

在JPA中,我正在尝试为JPA对象创建一个Update屏幕,其中包含该对象的类别列表。这是一对多关系。

我正在JPA对象中的表上创建一个具有以下属性的连接关系。

Classes.java

@JoinTable(name = "classes_has_class_categories",joinColumns = {
@JoinColumn(name = "classes_id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "class_categories_id", referencedColumnName = "id")})
@ManyToMany(cascade = CascadeType.ALL)
private Collection<ClassCategories> classCategoriesCollection;

我的问题的关键包含在下面的逻辑中,因为我更新了数据库,并且数据库中的一切都很棒。但是,我的问题是,当我稍后访问该对象时,该对象中的classCategoriesCollection属性没有所有正确的对象。我原本以为我的下面的刷新和刷新调用会将所有内容与数据库同步,但该对象属性仍为空UNTIL我重新部署/重新编译应用程序。请帮助我了解如何使此对象与对象中的当前数据库同步。

ClassManager.java

for(String c : cats)
{
      int cId = ConvertToInt(c);
      ClassCategories ca = em.find(ClassCategories.class, cId);

      if(ca != null)
      {

        try{
           if(!cla.getClassCategoriesCollection().contains(ca))
           {
               ClassHasCategoriesPK classHasCategoriesPK= new ClassHasCategoriesPK();

               classHasCategoriesPK.setCategoryId(ca.getId());
               classHasCategoriesPK.setClassId(cla.getId());

                ClassHasCategories cd = new ClassHasCategories(classHasCategoriesPK);

                em.persist(cd);
                em.flush();                               

            }
        }
        catch (Exception ex)
        {}    
        }
      }

      em.persist(cla); //cla is the Class object instance.
      em.flush();
      em.refresh(cla);

稍后在代码中....

request.setAttribute("classCategories",cl.getClassCategoriesCollection());

在重新编译应用程序之前没有正确的类。

1 个答案:

答案 0 :(得分:2)

当您的关系没有额外参数时,为什么M_N关系表有ClassHasCategories个类?由于Classes@ManyToMany(cascade = CascadeType.ALL)之间存在ClassCategories关系,因此您需要做的就是:

classObj.getClassCategoriesCollection().add(classCategoryObj);
em.merge(classObj).

提供程序将负责更新关系表。您还可以使用类似逻辑从classCategoriesCollection中删除项目:

classObj.getClassCategoriesCollection().remove(classCategoryObj);
em.merge(classObj).

所以答案是:

  • 如果classes_has_class_categories没有列,但pk包含两个fk,请乘坐ClassHasCategoriesClassHasCategoriesPK。使用classCategoriesCollection更新关系表。
  • 如果classes_has_class_categories有额外的列,则以ClassHasCategoriesPK分别为@ManyToOneClasses ClassCategories有两个ClassHasCategories关系的方式重做您的映射。通过直接操作@ManyToMany来更新关系。 Here是一个代码示例。

经验法则是,永远不要混合两种策略(就像你通过同一个表同时拥有ClassHasCategories关系和单独的{{1}}对象一样)。

干杯,