2016-11-04 4 views
0

は、私は、このアプローチに問題があり、次のクラスリポジトリまたはサービス層でflush()を呼び出しますか?例えば

@Repository 
public class JpaUserRepository implements UserRepository { 
    ... 
    public void create(User user) { 
     entityManager.persist(user); 
    } 
} 

@Trensactional 
public class UserServiceImpl implements UserService { 
    ... 
    public void register(User user) { 
     try { 
      repository.create(user); 
     } catch (DataIntegrityViolationException ex) { 
      throw new UserAlreadyExistException(user); 
     } 
    } 
} 

を持っています。トランザクションがコミットされるか、EntityManager#flush()が呼び出されるまで、Jpaは例外をスローしません。

私には2つの解決策があります。まず、UserRepositoryインターフェイスにflush()メソッドを追加し、UserServiceImpl#createメソッドのrepository.create(user)の後にrepository.flush()を呼び出します。 2番目はentityManager.persist(user)の後にentityManager.flush()を呼び出し、JpaUserRepository#createメソッドで呼び出され、UserRepositoryインターフェイスでドキュメント化されます。

UserRepositoryの別の実装では命令キャッシュを使用できないが、flush()メソッドを実装する必要があるため、最初のソリューションは柔軟性がありません。しかし、私が知っているように、JpaRepositoryはSpring Dataから使用しています。柔軟性の観点から、この状況でどのようなアプローチが最善でしょうか?

答えて

0

私はこの問題にその

public class JpaCrudRepository<T, PK extends Serializable> implements CrudRepository<T, PK> { 
    private boolean flushOnCreate = true 

    public JpaCrudRepository(boolean flushOnCreate) { 
     this.flushOnCreate = flushOnCreate; 
    } 


    /** 
    * Persist the given entity to repository and flushes all instructions if isFlushOnCreate() == true 
    * @param entity persisted entity 
    */ 
    @Override 
    public void create(T entity) { 
     entityManager.persist(entity); 
     if (flushOnCreate) { 
      entityManager.flush(); 
     } 
    } 
} 

@Repository 
public class JpaUserRepository extends JpaCrudRepository<User, Long> implements UserRepository { 

    public JpaUserRepository() { 
     super(true); 
    } 
    ..... 
} 

のようなものを解決し、サービス層は変更せずに残っ​​ています。

関連する問題