【问题标题】:JPA ManyToMany Not Populating Object PropertyJPA ManyToMany 不填充对象属性
【发布时间】:2011-09-13 04:22:46
【问题描述】:

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

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

类.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 属性没有所有正确的对象。我原以为我在下面的刷新和刷新调用会将所有内容与数据库同步,但该对象属性仍然为空,直到我重新部署/重新编译应用程序。请帮助我了解如何让该对象与对象中的当前数据库同步。

类管理器.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());

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

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    当你的关系没有额外的参数时,为什么你有一个用于 M_N 关系表的ClassHasCategories 类?由于ClassesClassCategories 具有@ManyToMany(cascade = CascadeType.ALL) 关系,因此您需要做的就是:

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

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

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

    所以,答案是:

    • 如果classes_has_class_categories 没有列,但有两个 fks 的 pk,请乘坐 ClassHasCategoriesClassHasCategoriesPK。与classCategoriesCollection 合作更新关系表。
    • 如果classes_has_class_categories 有额外的列,则重新映射,使ClassHasCategoriesPK 有两个@ManyToOne 关系,分别对应ClassesClassCategories。通过直接操作ClassHasCategories 来更新关系。 Here 是一个代码示例。

    经验法则是,永远不要混合使用这两种策略(就像您在同一个表中同时拥有 @ManyToMany 关系和单独的 ClassHasCategories 对象一样)。

    干杯,

    【讨论】:

    • 谢谢,JPA 新手,我仍在研究如何正确映射关系。我需要拿起一本好书。
    • 很高兴为您服务。 JPA 有其独特之处,其中一些甚至会让经验丰富的程序发疯,直到他们在实践中发现事情应该如何完成。我能说的是:“去过那里,做到了”。
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2019-06-16
    • 2019-06-16
    • 2010-09-24
    • 2011-06-13
    相关资源
    最近更新 更多