当前位置: 首页 > 面试题库 >

使用非唯一密钥的休眠关系OneToMany

颛孙飞
2023-03-14
问题内容

我无法描述我的问题,请通过示例再次尝试:

我有两个实体(表): DepartmentPerson 。这两个表有一个字段 CODE 这是 不是唯一的

如何 定义 这些表之间的manyToMany 双向关系

  1. 部门人员具有收集人员,该人员返回具有Person.CODE eq Department.CODE的所有实体
  2. 合作伙伴有收集部门,该部门返回所有带有Department.CODE eq的Partner.CODE实体

我需要关系定义-没有sql或hpql查询。

---------原始问题-------

我需要在部门和人之间建立一对多的hibernate关系(一个部门有很多人)。部门和人员具有时间有效性(validFrom,validTill)

class Department {
  Long id;
  String code; 
  String name;
  Date validFrom;
  Date validTill;
  @OneToMany(fetch = FetchType.LAZY, mappedBy = "departmentId")
  @OnDelete(action = OnDeleteAction.CASCADE)
  private Set<Person> persons = new HashSet<Person>();
}






 class Person {
      Long id;
      String name;
      String surname;
      Date validFrom;
      Date validTill;
    }

没有ORM(hibernate),很容易在指定日期选择特定部门的人员:

select P.* from Person P, Deparment d 
where d.code = ? and 
p.department_id = d.department_id and 
? between d.validFrom and d.validTill and 
? between p.validFrom and p.validTill

该关系必须使用非唯一键(CODE)代替部门ID。

有可能用hibernate做类似的事情吗?

我不需要单独的对象并自己构造查询。

我想使用ORM提供的所有功能(延迟加载,cascase持久化…)


问题答案:

更新

首先,您提到要使用ORM提供的所有功能。如果是这种情况,则需要使用Hibernate友好的模式。JPA持久性API和特定于Hibernate的API中都有可用的批注,使您可以更轻松地使用“旧版”数据库。但是,如果您想完全正确地使用Hibernate,则必须根据Hibernate的期望来设计架构。

在这种情况下,您可以通过使用联接公式而不是关系的联接列来执行您要的操作。连接公式是有效的SQL片段(可能会降低可移植性)。在下面的示例中,我省略了实际的SQL。

public class Person {
    ...
    @OneToMany
    @JoinFormula("sql fragment")
    private List<Department> departments;
    ...
}

public class Department {
    ...
    @OneToMany
    @JoinFormula("sql fragment")
    private List<Person> people;
    ...
}

您还应该考虑将代码视为Hibernate对象:

@Embeddable
public class Code {
    ...
    @Column(nullable = false, length = 20)
    private String code;
    ...
}

Hibernate持久性上下文和行映射过程可以有效地管理实体关系中的代码,而不仅仅是字符串。

最后,考虑将人与部门之间的关系实际映射为架构中的联接表。然后,您就可以利用@ManyToMany@JoinTable注释在实体中进行实际的基于架构的关系。



 类似资料:
  • 问题内容: 我有一个字段,例如,在表中应该是唯一的。 使用Spring / Hibernate验证进行验证的最佳方法是什么? 问题答案: 一种可能的解决方案是创建自定义约束(和相应的验证器)。并在数据库中查找现有记录,请提供(或Hibernate )to 的实例。 EntityManagerAwareValidator ConstraintValidatorFactoryImpl 唯一键 Uniq

  • 问题内容: 我不确定如何描述这个问题,所以我认为举个例子是问我问题的最好方法: 我有两个表具有多对多关系: 驾驶员许可证<->许可证类别 LicenceClass是诸如“汽车”,“摩托车”和“中型刚性”之类的东西。 使用Hibernate Criteria,如何找到同时具有“汽车”和“摩托车” LicenceClasses的所有许可证? 2008年12月11日更新我发现可以使用自定义ResultT

  • 问题内容: 一个只有一个数据库的hibernate会话将保持多少个连接? 问题答案: 在给定的时间,给定的会话将仅保留一个连接,您可以使用connect()方法进行访问。 使用reconnect()方法可以更改所使用的连接。

  • 问题内容: 我有实体类A和C。它们正在映射表tblA和tblC,并且它们之间具有多对多关系,而tblB则在它们之间进行映射。tblB包含A_ID,C_ID和SetDate,最后一个是它的设置日期,因此是关系的属性。我的问题是,如何最好地映射此属性?目前,它们尚未映射,如下所示: A: C: 我应该如何从中获取tblB.SetDate? 干杯 尼克 问题答案: 据我所知, 不可能 以这种方式进行映射

  • 问题内容: 关于以下与Hibernate有关的问题,我几乎看不到任何指针。这涉及到使用具有自身父子关系的单个数据库表来实现继承。例如: 在这里, managerId 列可以为null,或者可以指向 Employee 表的另一行。业务规则要求员工了解他的所有报告人以及他/她的经理。业务规则还允许行具有为空的 managerId (组织的CEO没有经理)。 我们如何在Hibernate中映射此关系,标

  • 问题内容: 我在Hibernate参考书的第21章中有一个基本的一对多关系父母/子女。 级联仅从子级到父级(持久级联仅是因为删除子级后我不希望删除父级)。 当我向父级添加一个子级并保存该子级时,我有一个TransientObjectException … 但是在saveOrUpdate上,我有以下异常: 我真的不明白,因为拯救孩子应该通过级联来拯救父母……有什么想法吗? 更新1 该问题似乎与“ o