views:

311

answers:

2

Hi,

In my code, I did as follows:

  • queried for a course entity
  • populate it with the given course data.
  • courseDao.update(entity) which internally calls persist(entity) method.
  • Surprisingly, the data is got updated successfully.

I am confused with this behaviour of persist method.

Please help me out.

code is as below:

//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);
        }
    }
}
+4  A: 

When an entity is currently managed (attached to a session), all updates to it are directly reflected to the underlying storage even without calling persist().

In your case, you load your entity, so it's in the session. Then even if you don't call persist() it will be updated in the database on transaction commit.

The persist() description from the javadoc:

Make an entity instance managed and persistent.

This means that the method doesn't do anything in your case, since your entity is both persistent and managed.

P.S. Where I say "session", understand "entity manager"

Bozho
Hi Bozho,Thanks for the response.But I have a question here. In my case, the entity is managed, then What is the use of persist/merge in the scenario as the "entity manager" will automatically updates the changes on commit.Thanks,Srihari
Srihari
no use. it is not required. the call does nothing.
Bozho
+1  A: 

JPA tries very hard to be a helpful API, such that anything you get from it (or save to it) will subsequently be tracked by JPA. This means than any further changes will be automatically handled for you by JPA without any additional work on your part.

Ophidian