は、私は、このアプローチに問題があり、次のクラスリポジトリまたはサービス層で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から使用しています。柔軟性の観点から、この状況でどのようなアプローチが最善でしょうか?