Java 层次结构中JPA实体之间的双向关系
我正在为我的项目使用SpringDataJPA(hibernate作为提供者),我想知道什么时候需要实体之间的双向映射 在我的用例中,我有一个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
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对此一无所知。这可能没问题,但可能会导致问题。也许应该发生更多的级联删除?也许您有一个实体侦听器,您想在删除前触发它?