web-dev-qa-db-ja.com

hibernate session.save()はデータベースに反映されません

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

1- session.close()で取得する場合は、getSessionFactory().openSession()にする必要があります。
2- session.close()で取得する場合、getSessionFactory().getCurrentSession()は不要です。 commit()の後に自動的に閉じられます。

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

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

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

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

[〜#〜] but [〜#〜]動作していません。つまり、スムーズに実行されますが、データベースに反映(保存)しません。トランザクション内にコードを記述してコミットすると、コードが保存されます。

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

23
mukund

SessionFactory.openSession()を使用してセッションを作成すると、トランザクションは作成されないため、操作はトランザクションコンテキスト外で実行されます。変更を確認するには、新しいトランザクションを開始するか、進行中のトランザクションの一部として操作を実行する必要があります。ドキュメントから:

典型的なトランザクションでは、次のイディオムを使用する必要があります。

Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     sess.close();
 }
18
Dmitry Kuskov

私もポイントを理解しようとしていました:save()はトランザクション境界外で挿入操作を実行できますだから私はこのようなことをしました

SessionFactory factory = new Configuration().configure()
                    .buildSessionFactory();
            Session session = factory.openSession();

            session.save(user);

            session.close();

しかし、データはデータベースに挿入されませんでしたので、私はこれをもう一度試してみましたが、今ではうまくいき、データは正常に挿入されました:

構成ファイル内:

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

およびJavaコード:

    SessionFactory factory = new Configuration().configure()
            .buildSessionFactory();
    Session session = factory.openSession();

    session.save(user);

    session.flush();
    session.close();
6
Vibhor Bhardwaj

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

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

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

6
rsu

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
}
3
Constantine Ch

データベースオブジェクトに対して作業単位を実行するときは常に、トランザクションを使用する必要があります。 http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html は、それらが使用される理由と使用方法を示します。ただし、重要なのは、transactionオブジェクトを返すsession.beginTransaction()を呼び出してTransactionオブジェクトを使用することです。これは、データベースに対して実行される作業単位を表します。

1
blackpanther

DAOをフラッシュしてから更新する必要があることがわかりました。

session.flush()
session.refresh(entityDAO)
1
Demian

コミットするのを忘れました。コミットする必要があります。

session.save(ac);
// you should to add this bottom line  
session.getTransaction().commit();
0
Oguzhan Cevik