2

よくわからない問題に遭遇しました。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 アノテーションを省略した場合、データベースは更新されません。

4

2 に答える 2

3

それは正常です。CRUD スキームでのすべてのデータベース操作には、トランザクション境界が必要です。これらの境界がなければ、DB には実際には何も書き込まれません。トランザクションは、DB 操作 (挿入、更新) のコレクションであり、すべてが成功するか、アクション全体が DB によって元に戻されます。そのため、トランザクションの開始時と終了時に Hibernate に通知する必要があります。これにより、Hibernate はどのアクションを作業単位と見なす必要があるかを通知できます。トランザクション境界がなければ、データベースへの最終的なコミットは決して行われません。

役に立ったことを願っています

于 2010-10-08T12:59:37.830 に答える
-1

フラッシュしてコミットしてみてください。

于 2010-10-08T12:57:52.613 に答える