Java JPA ManyToMany未填充对象属性

Java JPA ManyToMany未填充对象属性,java,jpa,Java,Jpa,在JPA中,我试图为JPA对象创建一个更新屏幕,其中包含该对象的类别列表。这是一种多对多的关系 我正在JPA对象内的表上创建具有以下属性的连接关系 Classes.java @JoinTable(name = "classes_has_class_categories",joinColumns = { @JoinColumn(name = "classes_id", referencedColumnName = "id")}, inverseJoinColumns = { @JoinColumn

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

我正在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;
稍后在代码中

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

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

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

classObj.getClassCategoriesCollection().add(classCategoryObj);
em.merge(classObj).
提供者将负责更新关系表。您还可以使用类似的逻辑从
classCategoriesCollection
中删除项目:

classObj.getClassCategoriesCollection().remove(classCategoryObj);
em.merge(classObj).
因此,答案是:

  • 如果
    classes\u有\u class\u categories
    没有列,只有带有两个FK的pk,则使用
    classhascegories
    classhascegoriespk
    。使用
    classCategoriesCollection
    更新关系表
  • 如果
    classes\u有\u class\u categories
    有额外的列,则以
    classhascegoriespk
    有两个
    @manytone
    关系的方式重新进行映射,分别用于
    classes
    ClassCategories
    。通过直接操作
    classhascegories
    更新关系。这是一个代码示例
经验法则是,永远不要将这两种策略混合使用(就像您在同一个表中同时拥有
@manytomy
关系和一个单独的
classhascegories
对象)


干杯,

谢谢,JPA新手,我还在想如何恰当地映射关系。我需要一本可靠的书。很高兴为您服务。JPA有它的特质,有些特质甚至会让经验丰富的程序发疯,直到他们在实践中发现事情应该如何做。我能说的是:“去过那里,做到了”。
classObj.getClassCategoriesCollection().remove(classCategoryObj);
em.merge(classObj).