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?
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. –