私の例では、1 つの Hibernate エンティティと 1 つの DAO があります。
@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);
}
}
そんな風にDAO in Serviceを使うと
@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);
}
}
1 行 (Action2) のみがデータベースに保存されます。コメントを削除すると、両方の行 (Action1 と Action2) が保存されます (これは必要な動作です)。私の質問は、サービスレイヤーのトランザクションアノテーションがトランザクション(メソッドexecuteTransaction())の実行にどのように影響するかです。サービスレイヤーにトランザクションアノテーションがないと、両方の行がデータベースに保存され、最後の行だけがこのアノテーションで保存されるのはなぜですか?