JPA-メソッドが@transactionalの場合にのみデータベースが更新されます
-
28-09-2019 - |
質問
私は本当に理解していない問題に遭遇しました - DAOで作業する方法が@Transactionalとして注釈が付けられない限り、基礎となるデータベースは更新されません。私のアプリは、JPA/Hibernate、Spring、Wicketで実行されます。何故ですか?
ダオ:
@Repository(value = "userDao")
public class UserDaoJpa implements UserDao {
@PersistenceContext
private EntityManager em;
public User findById(Long id) {
return em.find(User.class, id);
}
public List findAll() {
Query query = em.createQuery("select e from User e");
return query.getResultList();
}
public User create(User user) {
em.persist(user);
return user;
}
public User update(User user) {
return em.merge(user);
}
public void delete(User user) {
user = em.merge(user);
em.remove(user);
}
}
サービス:
@Service(value = "userManager")
public class UserManagerImpl implements UserManager {
@Autowired
UserDao dao;
public void setUserDao(UserDao dao) {
this.dao = dao;
}
public List getUsers() {
return dao.findAll();
}
public User getUser(String userId) {
return dao.findById(Long.valueOf(userId));
}
public void saveUser(User user) {
dao.update(user);
}
@Transactional
public void removeUser(User user) {
dao.delete(user);
}
}
@transactionalアノテーションを除外した場合、データベースは更新されません。
解決
まあそれは正常です:CRUDスキームのすべてのデータベース操作には、トランザクションの境界が必要です。これらの境界がなければ、DBに実際に書かれたものはありません。トランザクションとは、DB操作(挿入、更新)のコレクションであり、すべてが成功するか、DBによってアクション全体が元に戻されます。そのため、トランザクションが開始および終了したときに冬眠を伝える必要があるため、Hibernateはどのアクションが仕事の単位と見なされなければならないかを知ることができます。トランザクションの境界がなければ、データベースへの最終コミットは決して起こりません。
それが助けてくれることを願っています
他のヒント
フラッシュしてコミットしてみてください。
所属していません StackOverflow