我无法描述我的问题,请通过示例再次尝试:
我有两个实体(表): Department 和 Person 。这两个表有一个字段 CODE 这是 不是唯一的 。
如何 定义 这些表之间的manyToMany 双向关系 ?
我需要关系定义-没有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