私の例では、私は1つのHibernateエンティティと1つのDAOを持っています。サービスでのSpringトランザクションと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);
}
}
Iは
@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);
}
}
のみ一列(アクション2)はデータベースに保存されるようにサービスにDAOを使用します。コメントを削除すると、両方の行(Action1とAction2)が保存されます(これは必要な動作です)。私の質問は、サービス層のTransactionalアノテーションがトランザクション(メソッドexecuteTransaction())の実行にどのように影響するかです。サービスレイヤーでトランザクションアノテーションを使用しないと、両方の行がデータベースに保存され、最後に保存されたのはこのアノテーションに保存されるのはなぜですか?
DAOクラスにトランザクションをマークしないでください。私は、トランザクションはサービス層に属していると思います。これは、作業単位とユースケースについて知っているものです。単一のトランザクションで一緒に作業する必要のある複数のDAOがサービスに組み込まれている場合に役立ちます。 –