在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());
在重新编译应用程序之前没有正确的类。
答案 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,请乘坐ClassHasCategories
和ClassHasCategoriesPK
。使用classCategoriesCollection
更新关系表。classes_has_class_categories
有额外的列,则以ClassHasCategoriesPK
分别为@ManyToOne
和Classes
ClassCategories
有两个ClassHasCategories
关系的方式重做您的映射。通过直接操作@ManyToMany
来更新关系。 Here是一个代码示例。经验法则是,永远不要混合两种策略(就像你通过同一个表同时拥有ClassHasCategories
关系和单独的{{1}}对象一样)。
干杯,