【问题标题】:JPA (hibernate) relation OneToMany with dateJPA(休眠)关系OneToMany与日期
【发布时间】:2011-09-29 05:25:48
【问题描述】:

我需要在部门和个人之间创建一对多的休眠关系(一个部门有很多人)。

问题是我想保持时间有效性。如果没有 ORM (hibernate),很容易在指定日期选择特定部门的人员:

select * from Person where department_id = ? and ? between validFrom and validTill


如何使用 JPA 休眠?

class Department {
  Long id;
  String code; 
  String name;
  @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;
}

如果部门也是有效的怎么办?

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

具有相同deparment.code的所有记录为一个部门。

【问题讨论】:

标签: hibernate jpa one-to-many


【解决方案1】:

您在 JPA 中执行此操作的方式与您使用 SQL 执行此操作的方式相同。只需将其设为 JPQL 查询而不是 SQL 查询即可:

select p from Person p
inner join p.department d
where d.code = :departmentCode
and :today between d.validFrom and d.validTill 
and :today between p.validFrom and p.validTill

【讨论】:

  • 如何定义关系(注解)?是否可以在指定日期使用 EAGER 或 LAZY 加载?例如。我将加载部门,并且我想在指定日期在每个部门加载一组人员。问题已编辑 - 添加了关系。
  • 为了能够使用我的查询,您需要定义反向关联(Person 实体中的部门属性)。但是您也可以编写不同的查询(从部门开始并加入 d.persons)。每个协会都可以变得懒惰或渴望。日期不是关联。您可以将基本字段标记为惰性,但这通常没有用。
  • 对不起。我不明白你。如上所述,我有两个类(部门,人员)。我读了一个部门。 Hibernate 生成查询并仅加载部门。然后我访问人员集合(迭代或查询大小)。 Hibernate 代理将生成查询并用部门中的所有人员填写人员。查询是由hibernate生成的,如何添加日期参数?如果我手动填写人员集合,persist(Department) 将会出现问题,这应该在持久更改人员之前......(cascade.persist)
  • 当您访问人员集合时,您将获得部门的所有人员,无论他们是否有效。由您提供一种仅在给定日期返回有效人员的方法。您还可以对集合使用过滤器以仅返回当前日期的有效人员。见docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…
  • 谢谢。有什么方法可以处理第二个问题(部门也是有效的)?我需要定义子(Person)将具有非唯一父键(Department.code)的关系 - 在普通 sql 中,我可以按照我在最后一个查询语句中的描述进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2019-11-29
  • 2015-07-27
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多