2016-03-26 176 views
2

新しいレコードを挿入し、古いデータを失うことなく存在するレコードを更新する方法はありますか?Spring JPA:データを失うことなくupsertする方法

これは私のサービス層のメソッドです:私は、これは役に立たない方法だと思い

public void saveSample(Sample sample) { 
    Sample samplePersistent = sample; 

    if (sample.getId() != null) { 
     samplePersistent = sampleRepository.findOne(sample.getId()); 
     Assert.notNull(samplePersistent, "Sample entity not found with id : " + sample.getId()); 

     samplePersistent.setLocation(sample.getLocation()); 
     samplePersistent.setName(sample.getName()); 
     samplePersistent.setType(sample.getType()); 
     ... 
     ... 

    } 

    samplePersistent.cloneAuditingInfoFrom(sample); 
    sampleRepository.save(sample); 
} 

Spring BeanUtilsクラスまたは@DynamicUpdateアノテーションは私の問題を解決できますか?

答えて

2

すでにSpringとSpring-Data-Jpaを使用しているので、sampleRepository.save(sample);で十分です。 saveメソッドは、渡されたエンティティが新しいエンティティであるか、エンティティの識別値に基づいて既存のエンティティであるかを最初に確認します。 IDはエンティティの主キーによって定義されます。

EntityManager#mergeメソッドを使用することもできます。しかし、すでにSpringデータを使用しているので、saveメソッドは内部的にマージメソッドを呼び出します。

多くのフィールドが更新されているにも関わらず、実際には更新されておらず、他のテーブルに多くの制約がある場合を除き、@DynamicUpdateを使用する必要はありません。

Spring BeanUtilsはオブジェクトの永続性とは関係ありません。主にプロパティのコピー、Beanのメソッドの検索、プロパティ記述子の取得などのJava Bean固有の操作を行うことを目的としています。sample.getId()がnullかどうかをチェックしてレコードをフェッチする必要はありませんDBからfindOneメソッドを使用します。 sampleRepository.save(sample)を渡すだけでレコードを保存/更新します。

関連する問題