hibernate session.save()没有反映在数据库中

时间:2013-04-29 10:03:19

标签: java hibernate session

根据我对休眠的理解(请确认)

1-如果您通过session.close()获得,则必须getSessionFactory().openSession() 2-如果您通过session.close()获取,则无需getSessionFactory().getCurrentSession()。它会在 commit()后自动关闭。

3- @ 2 使用getSessionFactory().getCurrentSession()时,我们必须在活动事务中执行所有数据库活动,以便最后可以提交()。

4- Hibernate将所有保存,更新和删除操作置入,并仅在 flush() 操作或 <之后将它们提交到数据库服务器em>提交 事务或 关闭会话 ,其中发生了这些操作。(根据javadoc)

如果我考虑 1 &amp; 4 ,然后以下代码应该有效:

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

但是它无法正常工作,即它运行顺畅但不反映(存储)在数据库中。为什么会这样?当我在事务中编写代码并提交时,它就会被存储。

我想我错过了一件基本的事情。请澄清。

9 个答案:

答案 0 :(得分:18)

使用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();
 }

答案 1 :(得分:6)

我也试图理解这一点: 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();

答案 2 :(得分:6)

是的session.save没有事务就没有保存到数据库。 唯一的方法是使用

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

如果使用此属性,则不需要交易,也不需要session.flush()session.close()

答案 3 :(得分: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

<p>Lorem ipsum dolor sit <i>amet, </i>consectetur adipiscing elit.</p>
<p>Lorem ipsum dolor sit <i>amet</i>, consectetur adipiscing elit.</p>

正如文档中所写: 一个更灵活的解决方案是Hibernate内置的“当前会话”上下文管理:

// 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();
}

答案 4 :(得分:1)

每当您对数据库对象执行任何工作单元时,都必须使用事务。 http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html说明了它们的使用原因以及如何使用它们。但是,关键是通过调用返回transaction对象的session.beginTransaction()来使用Transaction对象。这将代表对数据库执行的工作单元。

答案 5 :(得分:1)

我发现我必须刷新然后刷新DAO,然后才能工作。

session.flush()
session.refresh(entityDAO)

答案 6 :(得分:0)

您忘记提交。应该提交。

draw()

答案 7 :(得分:0)

每当您执行save()时,请务必在完成后提交事务。

Account ac =new account()
ac.insert(123);
----------
----------
----------
----------
session.save(ac);

// Add this bottom line  
session.getTransaction().commit();

答案 8 :(得分:-2)

if there is DB manipulation operation then it should be in transaction
if you call session.save(object)
hibernate create bellow query only .
select hibernate_sequence.nextval from dual
so right code is here
Transaction  t=session.beginTransaction();
session.save(obect);
t.commit(); should not forgot to commit.
session.close();