jpa 2.0持久性:创建和更新困境

时间:2012-01-19 10:28:08

标签: hibernate jpa persistence

我使用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中是否存在可用于最小化工作量的机制?

干杯。

1 个答案:

答案 0 :(得分:1)

没有内置机制可以做你想做的事情,但这并不困难。

  1. 执行JPQL查询以获取其代码位于您收到的代码集中且其toDate字段为空的所有值:select c from Currency c where c.code in (:codes) and c.toDate is null(确保代码数不大于数据库限制但是对于IN子句。如果是,则执行多个查询)
  2. 从找到的货币列表中构建Map<String, Currency>(地图的关键字是货币代码)
  3. 迭代货币进行更新。对于每种货币,在地图中查找其持久版本。如果在地图中,请更新其toDate字段
  4. 创建一个新的货币实例并保留它。
  5. 对于基类的所有实现,可以很容易地使这个过程成为通用的。