2010-02-05 5 views
5

In meinem Code, ich habe wie folgt:Spring + JPA + Hibernate: Persist aktualisiert die Entität überraschend. Bitte gehen Sie durch die Details

  • für einen Kurs Einheit abgefragt
  • füllen Sie es mit den angegebenen Kursdaten.
  • courseDao.update (Entität), die intern Persistenz (Entität) -Methode aufruft.
  • Überraschenderweise wurden die Daten erfolgreich aktualisiert.

Ich bin mit diesem Verhalten der persist Methode verwirrt.

Bitte helfen Sie mir.

Code ist wie folgt:

//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); 
     } 
    } 
} 

Antwort

7

Wenn ein Unternehmen zur Zeit (an einer Sitzung) verwaltet wird, werden alle Aktualisierungen direkt an den zugrunde liegenden Speicher reflektiert auch ohne persist() aufrufen.

In Ihrem Fall laden Sie Ihre Entität, also ist es in der Sitzung. Dann, auch wenn Sie nicht persist() aufrufen, wird es in der Datenbank auf Transaktion Commit aktualisiert.

Die persist() Beschreibung aus dem javadoc:

ein Unternehmen Instanz verwaltet und persistent machen.

Dies bedeutet, dass die Methode in Ihrem Fall nichts bewirkt, da Ihre Entität sowohl persistent als auch verwaltet ist.

P.S. Wo ich sage "Sitzung", verstehen "Entity Manager"

+0

Hallo Bozho, Danke für die Antwort. Aber ich habe eine Frage hier. In meinem Fall wird die Entität verwaltet, dann Was ist die Verwendung von Persist/Merge in dem Szenario als der "Entity Manager" wird automatisch die Änderungen beim Commit aktualisiert. Danke, Srihari – Srihari

+0

keine Verwendung. es ist nicht notwendig. der Anruf tut nichts. – Bozho

1

JPA versucht sehr schwer, eine hilfreiche API zu sein, so dass alles, was Sie daraus erhalten (oder speichern) wird anschließend von JPA verfolgt werden. Dies bedeutet, dass jegliche weitere Änderungen automatisch von JPA ohne zusätzliche Arbeit für Sie bearbeitet werden.

Verwandte Themen