根据我对休眠的理解(请确认)
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.");
但是它无法正常工作,即它运行顺畅但不反映(存储)在数据库中。为什么会这样?当我在事务中编写代码并提交时,它就会被存储。
我想我错过了一件基本的事情。请澄清。
答案 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();