2017-02-13 6 views
1

SpringのJPAリポジトリからカスタムメソッドを作成する方法は、挿入機能と更新機能を分離しますの挿入方法を作成し、更新方法の更新方法を考えてみましょう。Spring JPAリポジトリ - 個別の挿入と更新の方法

その他の質問: なぜSpring JPA Repositoryは設計によってこれらのメソッドを分離しないのですか?

現在の実装はサービス層で検証を作成しています。

マイリポジトリ

public interface UserRepository extends CrudRepository<User, Integer> {} 

スタンダール春のデータリポジトリに独自の拡張機能を提供するために私のサービス

@Service 
public class UserService { 
    public void addUser(User user) { 
     if (!userRepository.exists(user.getId())) { 
      userRepository.save(user); 
     } 
    } 

    public void updateUser(int id, User user) { 
     if (userRepository.exists(user.getId())) { 
      userRepository.save(user); 
     } 
    } 
} 
+0

。しかし、私はそれが良い解決策だとは思わない。 – Mike

+0

なぜあなたはそれを望みますか、何を達成したいですか? @Mike:saveメソッドはCrudRepository インターフェイスで書かれているので、オーバーライドすることはできません。 –

+0

私はそれを書いてみる前にそれを試してみました。それは試みだったが、私はそれが良い解決策ではないと言った。 – Mike

答えて

2

はその可能:

は、すべてのリポジトリにカスタム動作を追加します:

https://docs.spring.io/spring-data/data-commons/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories

あなたが例えばロック機能を実装することができ

void lock(T entity, LockModeType lockModeType); 

しかし、あなたの場合には、私は、お勧めしたいだけ離れてチェックを残すために、その新しいかどうSpringDataRepositoryはすでにチェックが発生します。 IDがある場合は、それはとにかく存在するため、自分のIDを作成しないでください。これは、春のデータコントラクトのすべての部分です:

SimpleJpaRepository:あなたはあなたがリポジトリを作成し、その後、updateメソッドを作成する方法を保存@Overrideしようとすることができます

@Transactional 
public <S extends T> S save(S entity) { 

    if (entityInformation.isNew(entity)) { 
     em.persist(entity); 
     return entity; 
    } else { 
     return em.merge(entity); 
    } 
} 
+0

その検証は新しいデータと現在のデータを検証するためのもので、Spring JPAはそれを自動的に上書きしません。その検証のために、私はすべてのサービスの多くのバリデーションを作成する必要があります。それで、多くの挿入と更新の検証用の定型文があると思いますので、私はカスタムリポジトリで単純化する必要があります。 –

+0

私はあなたが本当にそれを必要としないと言うでしょう、あなたが新しいエンティティを持っている場合、IDは設定されません。それは永続化されます(isNew()check in save())。既存のものがある場合、それはIDを持ち、jpaはそれを永続化しようとします。 persistには楽観的なロックのようなより多くの特徴があり、同時操作を見つけるのに役立ちます - > https://vladmihalcea.com/2015/01/12/a-beginners-guide-to-java-persistence-locking/ – Dudelilama

+0

はい、ID設定されません。しかし、あなたがIDを挿入したり追加したりするのを防ぐことはできません。作成メソッドの例:HTTP POST/foo {id:1、attr:A}、save()だけを使用すると、既存のエンティティは新しいものによってオーバーライド(merge())されます。ですから、saveメソッドを使ってデータを更新することができないように、createメソッドを使用するユーザを防ぐバリデーションを追加する必要があります。 –

関連する問題