31

休止状態での私の理解によると(確認してください)

1- までsession.close()に入手する場合は、しなければなりませんgetSessionFactory().openSession()
2- までsession.close()に入手した場合は必要ありませんgetSessionFactory().getCurrentSession()commit()の後、自動的に閉じられます。

3- @2を使用する場合getSessionFactory().getCurrentSession()、最後に commit() できるように、アクティブなトランザクション内ですべての DB アクティビティを実行する必要があります。

4- Hibernate はすべての保存、更新、および削除操作をキューに入れ、flush()操作、トランザクションのコミット、またはこれらの操作が発生したセッションの終了の後にのみデータベース サーバーに送信します。(javadoc に従って)

上記の点から、 1 & 4を考慮すると、次のコードが機能するはずです。

Session session = HibernateUtil.getSessionFactory().openSession();  
AccountDetails ac = new AccountDetails();  
//perform set operations  
session.save(ac);  
session.close();  
System.out.println("new account stored.");

しかし、それは機能していません。つまり、スムーズに実行されますが、データベースに反映 (保存) されません。なぜですか? トランザクション内にコードを記述してコミットすると、それが保存されます。

基本的なことが欠けていると思います。どうか明らかにしてください。

4

9 に答える 9

6

ええsession.save、トランザクションがないとデータベースに保存されません。それを行う唯一の方法は、

<property name="connection.autocommit">true</property>

このプロパティを使用する場合、トランザクションは必要ありませんsession.flush()session.close()

于 2015-08-27T02:07:59.340 に答える
3

session.close() は、セッションを閉じることのみを担当し ます https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#close()

hibernate セッションの操作方法: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics

// Non-managed environment idiom
Session sess = factory.openSession();
Transaction tx = null;
try {
    tx = sess.beginTransaction();

    // do some work
    ...

    tx.commit();
}

catch (RuntimeException e) {
    if (tx != null) tx.rollback();
    throw e; // or display error message
}
finally {
    sess.close();
}

ドキュメントに書かれているように: はるかに柔軟なソリューションは、Hibernate の組み込みの「現在のセッション」コンテキスト管理です。

// Non-managed environment idiom with getCurrentSession()
try {
    factory.getCurrentSession().beginTransaction();

    // do some work
    ...

    factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
    factory.getCurrentSession().getTransaction().rollback();
    throw e; // or display error message
}
于 2016-09-06T06:00:05.423 に答える
1

DAOをフラッシュしてからリフレッシュする必要があることがわかりましたが、うまくいきました。

session.flush()
session.refresh(entityDAO)
于 2016-09-07T18:44:37.930 に答える