我使用JPA 2.0和hibernate作为jpa-provider。我的项目的方向是保持DAO的JPA - 实现中立。所以,我不能使用hibernate会话对象或任何特定于hibernate的东西。我们有大量的查找,这些查找值应该是周期性的,我的意思是它们在一段时间内基本保持不变,例如我们有货币查找表
Currency code --> Drachma
Description --> Greece
From date --> 01-Jan-1960
To date --> 01-Nov-2005 (this is just an example)
Currency code --> Euro
Description --> Greece
From date --> 02-Nov-2005
To date --> null (null indicates until today)
我设计了一个基本查找类,对于所有查找都是这样的
@MappedSuperclass
public abstract class BaseLookupEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "code", nullable = false)
private String code;
@Column(name = "description", nullable = false)
private String description;
@Column(name = "from_date", nullable = false)
@Temporal(TemporalType.DATE)
private Date fromDate;
@Column(name = "to_date")
@Temporal(TemporalType.DATE)
private Date toDate;
// getters and setters
困境是
假设服务层从没有身份字段的客户端接收新实例,对于包含n个这样的定期查找代码的实体的每个创建或更新,我是否需要明确查询所有这些查找表以查看如果这些值存在,并且它们存在且需要更新,请更新to_date列,然后创建新的查找条目。
我是否需要执行此DIY逻辑,或者JPA中是否存在可用于最小化工作量的机制?
干杯。
答案 0 :(得分:1)
没有内置机制可以做你想做的事情,但这并不困难。
select c from Currency c where c.code in (:codes) and c.toDate is null
(确保代码数不大于数据库限制但是对于IN
子句。如果是,则执行多个查询)Map<String, Currency>
(地图的关键字是货币代码)对于基类的所有实现,可以很容易地使这个过程成为通用的。