2016-11-04 56 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); 
     } 
    } 
} 

有这种方法的一个问题。 Jpa不会抛出任何异常,直到交易被提交或调用EntityManager#flush()

我有两个解决方案。首先是将一个flush()方法添加到UserRepository接口,并在调用repository.create(user)UserServiceImpl#create方法后调用repository.flush()。第二种是在entityManager.persist(user)JpaUserRepository#create方法中调用entityManager.flush()并在UserRepository接口上记录它。

第一个解决方案不太灵活,因为UserRepository的另一个实现可能不使用指令缓存,但必须实现flush()方法。但正如我所知,Spring Data的JpaRepository使用它。从灵活性的角度来看,在这种情况下哪种方法最好?

回答

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); 
    } 
    ..... 
} 

服务层仍然没有改变。