Hibernate 和 Jackson 与额外字段的多对多关系

Hibernate and Jackson manyToMany relation with extra fields

最近我一直在尝试通过多对多关系 link 模块 table 和 Activity table。 此关系欢迎添加如下字段。

-------------------------------------------------------------
| Module        |   ModuleHasActivities |     Activities    |
-------------------------------------------------------------
| id            |  Module_idModule      |   id              |   
| Name          |  Activity_idActivity  |   Name            |
| Observations  |  Day                  |   Price           |
-------------------------------------------------------------

我使用 JsonManagedReference 和 JsonBackReference 来避免无限循环。不幸的是,结果不是预期的,因为我没有从活动中获得模块列表,反之亦然。返回的唯一信息是实体字段。

@Entity
@Table(name = "Module")
public class Module implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "idModule")
    private int id;
    
    // Other fields plus getter and setter

    @OneToMany(mappedBy = "module", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
@Table(name = "Activite")
public class Activite implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "idActivite")
    private int id;

    // Other fields

    @OneToMany(mappedBy = "activite", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
@Table(name = "Module_has_Activite")
public class ModuleHasActivities implements Serializable {

    @Id
    @ManyToOne
    @JoinColumn(name = "Module_idModule")
    @JsonManagedReference
    private Module module;

    @Id
    @ManyToOne
    @JoinColumn(name = "Activite_idActivite")
    @JsonManagedReference
    private Activite activite;

    @Column(name = "IdJour")
    private int jour;

}

查询模块响应:

[
    {
        "id": 1,
        "code": "TT1",
        "title": "Test 1",
        "description": "Nothing",
        "observations": "Nothing",
    }
]

我期望的(类似这样的):

[
    {
        "id": 1,
        "code": "TT1",
        "title": "Test 1",
        "description": "Nothing",
        "observations": "Nothing",
        "activities": [
          "day1": 
          {
           //fields of activities
          },
          "day2": 
          {
           //fields of activities
          },
    ]
    }
]

当我调试 hibernate 的 SQL 查询时,我们发现连接从未完成。这就是我感兴趣的!缺少模块 table 的关节。

不胜感激,

谢谢

已经访问过 links : Extra fields for many to many relations

您需要了解 JsonManagedReferenceJsonBackReference 之间的区别。请参阅: 了解更多信息。

@Entity
public class Module  {
    @JsonBackReference
    private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}

@Entity
public class ModuleHasActivities implements Serializable {
    @JsonManagedReference
    private Module module;
}

在这里,如果您序列化 Module 对象,您将不会在 json 中获得 moduleHasActivities 字段,但如果您序列化 ModuleHasActivities 对象,您将获得 module 字段。

所以,解决方案是翻转 @JsonBackReference@JsonManagedReference如下:

@Entity
public class Module  {
    @JsonManagedReference
    private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}

@Entity
public class ModuleHasActivities implements Serializable {
    @JsonBackReference
    private Module module;
}

终于,我解决了我的问题。我没有使用复合键,而是更改了数据库模型以使用主 id 键和 2 个对相关表的引用。映射更容易,我得到了我的信息。