Java 层次结构中JPA实体之间的双向关系

Java 层次结构中JPA实体之间的双向关系,java,spring-boot,hibernate,jpa,spring-data-jpa,Java,Spring Boot,Hibernate,Jpa,Spring Data Jpa,我正在为我的项目使用SpringDataJPA(hibernate作为提供者),我想知道什么时候需要实体之间的双向映射 在我的用例中,我有一个CategoryGroup实体,它与部门实体具有@manytone关系。目前,我在部门实体中没有相应的@OneToMany关系。从我对其他帖子的理解来看,除非我需要通过entity/hibernate删除,否则我可能不需要这样做。我想知道,通过双向关系,我还能得到什么 这是我的部门,不包括访问者: @Entity @Table(name="d

我正在为我的项目使用SpringDataJPA(hibernate作为提供者),我想知道什么时候需要实体之间的双向映射

在我的用例中,我有一个
CategoryGroup
实体,它与
部门
实体具有
@manytone
关系。目前,我在
部门
实体中没有相应的
@OneToMany
关系。从我对其他帖子的理解来看,除非我需要通过entity/hibernate删除,否则我可能不需要这样做。我想知道,通过双向关系,我还能得到什么

这是我的
部门
,不包括访问者:

@Entity
  @Table(name="dbo.Department")
  public class Department 
  {
        @Id
        @Column(name="id")
        private long id;
            
        @Column(name="name")
        private String name;
  }
@Entity
@Table(name="dbo.CategoryGroup")
public class CategoryGroup
{
    @Id
    @Column(name="id")
    private long id;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="dept_id")
    private Department department;
    
    @Column(name="name")
    private String name;
    
    public CategoryGroup()
    {       
    }
    
    public CategoryGroup(String name, Department department)
    {
        this.name = name;
        this.department = department;
    }
}
这是
CategoryGroup
不包括访问者:

@Entity
  @Table(name="dbo.Department")
  public class Department 
  {
        @Id
        @Column(name="id")
        private long id;
            
        @Column(name="name")
        private String name;
  }
@Entity
@Table(name="dbo.CategoryGroup")
public class CategoryGroup
{
    @Id
    @Column(name="id")
    private long id;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="dept_id")
    private Department department;
    
    @Column(name="name")
    private String name;
    
    public CategoryGroup()
    {       
    }
    
    public CategoryGroup(String name, Department department)
    {
        this.name = name;
        this.department = department;
    }
}
作为跟进,我的结构本质上是分层的<代码>类别实体与
类别组
实体有
@ManyToOne
关系,进一步说
子类别
实体与
类别
实体有
@ManyToOne
关系

如果我一直在关系的父端添加双向关系映射,那么这是否意味着一旦我检索到
部门
,我将得到整个实体层次结构,直到
子类别
?对于我的用例来说,这是不可取的。标记与
FetchType.LAZY
的关系会缓解这种情况吗


谢谢

OneToMany和ManyToMany关联在默认情况下是惰性的,因此在添加这些关联时不会获取整个层次结构

通常,添加这些关联可以极大地帮助您进行查询,因为它减少了基于连接条件的显式实体连接的需要。除此之外,如果需要,您还可以定义“删除级联”(delete cascading),也就是说,如果删除了某个部门,您可能希望删除与其关联的所有CategoryGroup


除此之外,可能需要从建模的角度显式地分离域。您可能希望隔离某个部门,即不知道与之连接的对象的任何信息。

您的意思是要递归获取双向关系的数据吗?@User-Upvotedon'tsayThanks实际上,我在
部门上放置@OneToMany注释时出错了@OneToMany(cascade=CascadeType.ALL,mappedBy=“department”,orphanRemoving=true)私有列表类别组;您能添加问题中的错误吗?@User-Upvotedon'tsaytanks请求处理失败;嵌套异常为HttpMessageConversionException:类型定义错误:[简单类型,类org.hibernate.proxy.pojo.javassist.javassistlazInitializer];嵌套异常为com.fasterxml.jackson.databind.exc.InvalidDefinitionException:未找到类JavassisTlazInitializer的序列化程序,也未找到创建BeanSerializer的属性(为避免异常,请禁用空bean上的SerializationFeature.FAIL_)(通过引用链:ArrayList[0]>com.CategoryGroup[“department”]->com.Department_$$\u jvstbb0_1[“handler”])@User-Upvotedon'tsaytanks不确定是否需要实现可序列化。此外,我没有覆盖
CategoryGroup
中的equals或hashcode。我也读过一些关于这方面的文章。我现在有一个独立的部门,隔离它还需要什么?我可能误解了你,但你的最后一段似乎与前两段相矛盾,因为在我的情况下,
部门
将是
一方
,因此从这个意义上讲,它将知道与它相关的对象。你问的是一般的双向关联,我试图给你理由为了做它和避免它。最后,它总是取决于你想要实现什么。虽然我认为添加这些双向关联通常是很好的,但是将<<代码> SET>代码>添加到<代码>部门< /代码>可能是不可取的,因为您引入了模型/代码依赖性。根据您的需要,您可以选择其中一种。是否可以在部门中不包含CategoryGroup集合而建立双向关系?对于删除,将在
CategoryGroup
帮助中的
部门
实例上声明@OnDelete(action=ondeletection.CASCADE)?切题地说,它是一个集合还是一个列表重要吗?我想我想知道的是,在哪种情况下,这是一个好主意,而在哪一种情况下,这是一个不可取的主意?就像一篇文章,总的来说,我认为这是一个好主意。不包括它的唯一原因是,当您想要隔离模型时(例如,
部门
)。
@OnDelete
只会删除DBMS端的表行,而Hibernate对此一无所知。这可能没问题,但可能会导致问题。也许应该发生更多的级联删除?也许您有一个实体侦听器,您想在删除前触发它?