2013-05-21 14 views
5

In meinem Beispiel habe ich eine Hibernate-Entität und ein DAO.Spring-Transaktion in Service- und DAO-Schichten

@Entity 
@Table(name="myEntity") 
public class MyEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="id") 
    private long id; 

    @Column(name="action") 
    private String actionName; 

} 

................... 

@Repository("myDAO") 
@Transactional(propagation = Propagation.REQUIRED) 
public class MyDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public void saveObject(MyEntity myEntity){ 
     sessionFactory.getCurrentSession().save(myEntity); 
    } 

} 

Wenn ich DAO in Service verwenden in einer solchen Weise

@Service("myService") 
@Transactional(propagation = Propagation.REQUIRED) 
public class MyService 
{ 

    @Autowired 
    private MyDAO myDAO; 

    public void executeTransaction(){ 
     MyEntity myEntity = new MyEntity(); 

     myEntity.setActionName("Action1"); 
     myDAO.saveObject(myEntity); 

//  myEntity = new MyEntity(); 
     myEntity.setActionName("Action2"); 
     myDAO.saveObject(myEntity); 
    } 

} 

nur eine Zeile (Action2) wird in der Datenbank gespeichert. Wenn ich den Kommentar lösche, werden beide Zeilen (Action1 und Action2) gespeichert (das ist das Verhalten, das ich brauche). Meine Frage ist, wie die transaktionale Annotation auf der Serviceebene die Transaktion beeinflusst (Methode executeTransaction()). Warum werden ohne Transaktionsannotation auf der Serviceebene beide Zeilen in der Datenbank gespeichert und nur die letzte mit dieser Anmerkung gespeichert?

+0

Markieren Sie keine DAO-Klassen. Ich denke, Transaktionen gehören auf die Service-Schicht. Es ist derjenige, der über Arbeitseinheiten und Anwendungsfälle Bescheid weiß. Es ist hilfreich, wenn mehrere DAOs in einen Service eingefügt werden, die in einer einzigen Transaktion zusammenarbeiten müssen. –

Antwort

5

Ohne myEntity = new MyEntity(); wird Ihr Datensatz in der Datenbank aktualisiert, nicht eingefügt, da es die gleiche Entität ist. Ich suggest, um <property name="show_sql">true</property> im Hibernate conf zu setzen. Dies wird Ihnen zeigen, was passiert.

+0

Aktion2 hat id = 0? –

+0

Mit GenerationType.IDENTITY kann die Datenbank die PK-Generierung übernehmen. Also, wenn Sie nicht Ihre Spalte in der DB als Autoinkrement und PK haben, ist es normal zu sein 0 –

+0

Ich habe Eigenschaft show_sql und ich sah die zweite Abfrage ist Update. Danke, das erklärt, was ich brauche. – mvb13

0

Zwei verschiedene Datensätze werden nur in der Datenbank gespeichert, wenn Sie zwei verschiedene Objekte speichern. Wenn Sie diese Zeile kommentiert haben, werden Eigenschaften in demselben Objekt festgelegt (dh aktualisiert). Hibernate aktualisiert also dieselbe Zeile, anstatt eine neue Zeile zu erstellen. Wenn Sie diese Zeile jedoch auskommentieren, erstellen Sie eine neue Instanz, die nicht bereits beibehalten wurde. Dies führt dazu, dass eine neue Zeile in die Datenbank eingefügt wird.