JPA - база данных обновляется только тогда, когда метод @transactional

StackOverflow https://stackoverflow.com/questions/3890656

Вопрос

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

Дао:

@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 требует ее границ транзакции. Без этих границ ничего не получает на самом деле не написано в БД. Сделка представляет собой коллекцию манипуляций БД (вкладыши, обновления) WHOICH, чтобы все было успешно, или все действия не отменяются БД. Вот почему вы должны сказать в гибернации, когда транзакция начинается и заканчивается, поэтому Hibernate может сказать, какие действия должны быть рассматриваются как единицы работы. Без границ транзакции финальный коммит к базе данных никогда не случается.

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

Другие советы

Попробуйте промыть и совершать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top