JPA - база данных обновляется только когда метод @Transactional - PullRequest
2 голосов
/ 08 октября 2010

Я столкнулся с проблемой, которую на самом деле не понимаю - если метод, работающий с DAO, не аннотирован как @Transactional, базовая база данных не обновляется.Мое приложение работает на JPA / Hibernate, Spring и Wicket.Почему это так?

DAO:

@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, база данных не будет обновлена.

Ответы [ 2 ]

3 голосов
/ 08 октября 2010

Ну, это нормально: каждая манипуляция с базой данных в схеме CRUD требует своих границ транзакций.Без этих границ в БД ничего не пишется.Транзакция - это набор манипуляций с БД (вставки, обновления), которые должны быть успешными, иначе БД отменит все действие.Вот почему вы должны сообщить Hibernate, когда транзакция начинается и заканчивается, чтобы Hibernate мог определить, какие действия должны рассматриваться как Единицы работы.Без границ транзакций окончательная фиксация в базе данных никогда не произойдет.

надеюсь, что помогло

0 голосов
/ 08 октября 2010

Попробуйте сбросить и зафиксировать.

...