2012-01-19 8 views
0

JPA 2.0をjpa-providerとしてhibernateとともに使用しています。私のプロジェクトの方向性は、DAOのJPA実装を中立に保つことです。だから、私は休止状態のセッションオブジェクトまたは休止状態に特有のものを使用できません。私たちは、検索のかなりの数が多いと、これらの参照値は、私は彼らが主に期間例えば、一定のまま意味それによる定期的なことになっている、我々は持っていると言う、私は基本ルックアップクラスを設計しているjpa 2.0永続性:ジレンマの作成と更新

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

あなたが望むことをするための組み込みのメカニズムはありませんが、それほど難しいことではありません。

  1. そのコードのコードのセットであるあなたが受け取るとそのtoDateまでフィールドnullであるすべての値を取得するためにJPQLクエリを実行します。select c from Currency c where c.code in (:codes) and c.toDate is nullは(コード数はのためのデータベースの上限以下であることを確認してくださいその場合は、複数のクエリを実行するけれどもIN句、。)
  2. 通貨のリストからMap<String, Currency>を作成し更新する通貨以上(マップのキーは、通貨のコードである)
  3. 反復を見つけました。各通貨について、その永続的なバージョンを地図で見つけます。マップ内にある場合、toDateフィールドを更新します。
  4. 新しい通貨インスタンスを作成し、それを保持します。

このプロセスは、基本クラスのすべての実装で簡単に行うことができます。

+0

ありがとうございました。それは助けになった – JProgrammer

関連する問題