2013-05-21 9 views
5

私の例では、私は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())の実行にどのように影響するかです。サービスレイヤーでトランザクションアノテーションを使用しないと、両方の行がデータベースに保存され、最後に保存されたのはこのアノテーションに保存されるのはなぜですか?

+0

DAOクラスにトランザクションをマークしないでください。私は、トランザクションはサービス層に属していると思います。これは、作業単位とユースケースについて知っているものです。単一のトランザクションで一緒に作業する必要のある複数のDAOがサービスに組み込まれている場合に役立ちます。 –

答えて

5

myEntity = new MyEntity();を指定しないと、データベース内のレコードは更新されますが、同じエンティティであるため挿入されません。私は、休止状態のconfに<property name="show_sql">true</property>を設定することをお勧めします。これは何が起こっているかを表示します。

+0

Action2のid = 0ですか? –

+0

GenerationType.IDENTITYを使用すると、データベースでPK世代の世話をすることができます。ですから、あなたがDBにオートインクリメントとPKとしてカラムを持っていなければ、それは0になるのが普通です。 –

+0

私はプロパティshow_sqlを設定して、2番目のクエリが更新されているのを見ました。ありがとう、これは私が必要とする事を説明する。 – mvb13

0

2つの異なるレコードをデータベースに保存するのは、2つの異なるオブジェクトを保存する場合だけです。その行にコメントを付けると、同じオブジェクト内のプロパティを設定(更新)することになります。したがって、hibernateは、新しい行を作成するのではなく、同じ行を更新します。 ただし、その行のコメントを外すと、まだ保持されていない新しいインスタンスが作成されます。したがって、新しい行がデータベースに挿入されます。

関連する問題