Spring + JPA + Hibernate: persist неожиданно обновляет сущность. Пожалуйста, пройдите подробности - PullRequest
5 голосов
/ 05 февраля 2010

В моем коде я сделал следующее:

  • запрошено для сущности курса
  • заполнить ее данными данного курса.
  • courseDao.update (entity), который внутренне вызывает метод persist (entity).
  • Удивительно, но данные успешно обновляются.

Я запутался в этом поведении метода persist.

Пожалуйста, помогите мне.

код, как показано ниже:

//My Service......
@Service("myService")
@Transactional
public class MyServiceImpl implements MyService {

  @Transactional(rollbackFor = { Throwable.class })
  public void updateCourse(final Course course) throws MyServiceException {
    ------
    ------
    CourseEntity courseEntity = courseDao.findById(course.getId());
    populateCourseEntity(courseEntity, course);

    courseDao.update(courseEntity);
  }
}

//CourseDao.....

public class CourseDaoImpl implements CourseDao {
   --------
   public void update(final T entity) throws MyDaoException {
        if (entity != null) {
            this.entityManager.persist(entity);
        }
        else {
            String errMsg = "Object to be updated cannot be null.";
            throw new MyDaoException(errMsg);
        }
    }
}

Ответы [ 2 ]

7 голосов
/ 05 февраля 2010

Когда объект в данный момент управляется (присоединяется к сеансу), все его обновления напрямую отражаются в базовом хранилище, даже без вызова persist().

В вашем случае вы загружаете свою сущность, поэтому она находится в сеансе. Тогда, даже если вы не позвоните persist(), он будет обновлен в базе данных при фиксации транзакции.

Описание persist() из Javadoc:

Сделать экземпляр сущности управляемым и постоянным.

Это означает, что метод ничего не делает в вашем случае, так как ваша сущность является как постоянной, так и управляемой.

P.S. Там, где я говорю «сессия», понимают «менеджер сущностей»

1 голос
/ 05 февраля 2010

JPA очень старается быть полезным API, так что все, что вы получите от него (или сохраните в нем), впоследствии будет отслеживаться JPA. Это означает, что любые дальнейшие изменения будут автоматически обработаны для вас JPA без какой-либо дополнительной работы с вашей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...