Hibernate 文档显示了以下示例:
session = sessionFactory.openSession();
session.beginTransaction();
List result = session.createQuery( "from Event" ).list();
for ( Event event : (List<Event>) result ) {
System.out.println( "Event (" + event.getDate() + ") : " +
event.getTitle() );
}
session.getTransaction().commit();
session.close();
session.getTransaction().commit()
即使仅打印了事件列表,为什么仍需要执行?
SELECT还需要事务。没有任何事务就无法执行SELECT。使用某些SQL
GUI工具从数据库中选择数据时,不必显式启动和结束事务,这是因为这些工具正在使用自动提交模式。在自动提交模式下,数据库将为每个SQL语句自动启动并提交事务,这样您就不必显式声明事务边界。
如果您不结束(即提交或回滚)事务,则该事务使用的数据库连接将不会被释放,并且您的数据库最终将耗尽可用的连接。
对于hibernate模式,默认情况下使用非自动提交模式(由属性指定hibernate.connection.autocommit
)。因此,我们必须声明交易边界并确保交易结束。
但是,如果仅使用hibernate API查询数据,即使没有显式声明事务边界,也可以这样做,原因如下:
当当前SQL语句需要一个新的事务并且之前没有显式启动任何事务时,数据库通常会自动启动一个新事务。
Session.close()
将关闭底层的Connection。根据JDBC规范,如果调用java.sql.Connection#close()并且有一个活动事务,则此活动事务的结果取决于JDBC供应商的实现。通常,JDBC驱动程序会自动提交或回滚此事务。但是在这种情况下,事务是提交还是回滚并不重要,因为您已经获得了所需的数据。
问题内容: 目前,我在 每个 Controller方法中 都 重复了以下代码: 这是正确的方法还是有更好的方法,也许在一个我可以引用的单独的类中?如果是这样,怎么办?每当我尝试将其放在单独的类中并从其他类中引用它时,它都会失败。 编辑 :我正在尝试使用尽可能少的外部库。如果Java在JDK中内置了ORM / JPA实现,我就不会使用Hibernate。 问题答案: 我本人已经遇到了很多次。通常,我
问题内容: 我有一个专门用于通过休眠的持久层将数据持久保存在db中的类。 问题在于它不保留数据。 堆栈是: 但我必须指出,它在其他课程中也能正常工作。 更新 : 当我把它印出来的时候给我。 更新 我试图获得更多有关该错误的信息: 我知道问题出在哪里: 实际上,该表对同一张表有2 fk ,而我,我坚持的是 问题答案: 可能引发了异常。这意味着该子句中没有要回滚的活动事务。这就是为什么引发另一个异常(
问题内容: 考虑以下简单的Hibernate场景: 此代码产生以下异常: 这是怎么回事? 问题答案: 好吧,看来一旦我们达到要求,交易就已经提交了。我唯一的猜测是Hibernate 在访问对象时已经提交了事务。 解决方法很简单:
问题内容: 如果我有如下代码: 在开始和提交之间,正在读取的表是否被锁定,并且随后是否会在多用户环境中引起问题,在该环境中,当另一个用户调用上面的相同代码时会发生问题? 如果以上情况有问题,我们是否应始终尝试缩短交易时间?并为此提供便利,而不是在懒惰的关系上调用getter方法,这是否意味着最好使交易简短并为父母的子女手动查找? 问题答案: Hibernate不会做任何事情来显式锁定您从中读取的表
问题内容: 我有一个hibernate映射,该映射一直工作到最近-尽管我确定这是我所做的某些更改的结果,但我似乎找不到它。 映射文件将字段定义为: 该类将该字段定义为: 运行此代码时,出现以下错误: 与此对应的数据库字段定义为: 我还有其他几个具有相似结构和定义的类,并且它们没有问题。但是,可能由于我最近所做的一些更改而导致,此特定映射将不再正常工作。 有什么建议么? 问题答案: 我不确定,但是您
问题内容: 我收到了一个我无法解释的奇怪的Hibernate异常。告诉我我正在使用二级缓存,但是没有在哪里指定二级缓存。这是例外: 而我的: 有什么想法会触发此异常吗?提前致谢! 问题答案: Pau在hibernate.cfg.xml中写了hibernate.cache.region.factory_class: 唯一的例外是不言而喻的。您必须设置 属性。例如,使用ehcache将添加以下行: n