6

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

4

2 に答える 2

5

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

于 2013-05-21T13:49:13.260 に答える
0

2 つの異なるオブジェクトを保存する場合にのみ、2 つの異なるレコードがデータベースに保存されます。その行にコメントを付けた場合、同じオブジェクトのプロパティを設定 (更新を意味します) しています。したがって、休止状態は、新しい行を作成する代わりに、同じ行を更新します。ただし、その行のコメントを外すと、まだ永続化されていない新しいインスタンスが作成されます。そのため、データベースに新しい行が挿入されます。

于 2013-05-22T05:18:05.307 に答える