【问题标题】:Hibernate and Jackson manyToMany relation with extra fieldsHibernate 和 Jackson 与额外字段的多对多关系
【发布时间】:2020-10-22 14:06:04
【问题描述】:

最近我一直在尝试通过多对多关系链接模块表和活动表。 此关系欢迎以下附加字段。

-------------------------------------------------------------
| 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 查询时,我们看到连接从未完成。这就是我感兴趣的!模块表的接头丢失。

不胜感激,

谢谢

已经访问过的链接: Extra fields for many to many relations

【问题讨论】:

    标签: java spring-boot hibernate jackson


    【解决方案1】:

    您需要了解JsonManagedReferenceJsonBackReference 之间的区别。请参阅:https://stackoverflow.com/a/37394318/607637 了解更多信息。

    @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;
    }
    

    【讨论】:

    • 好的,首先感谢您的回答。我尝试了您的解决方案,并且在调试跟踪中有内部联接查询。但这是一个无限递归错误!在我的 ModuleHasActivities 中,Module 字段按照您的建议在 JsonBackReference 中,我让 JsonManagedReference 中的 Activity 字段以获取所有活动。这可能是错误的
    • 任何帮助@gtiwari333?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 2023-02-02
      • 2017-11-22
      • 1970-01-01
      • 2015-12-02
      相关资源
      最近更新 更多