我的 hibernate 配置:
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
properties.put("hibernate.hbm2ddl.auto", "validate");
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.id.new_generator_mappings", "false");
properties.put("hibernate.connection.autocommit", "true");
properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
properties.put("hibernate.connection.url", DBConnection.url);
properties.put("hibernate.connection.username", DBConnection.username);
properties.put("hibernate.connection.password", DBConnection.password);
代码示例:
// pattern 1
Session s = sessionFactory.openSession();
ObjectA A = s.load(ObjectA.class, pk);
A.setAttr("abc");
s.update(A);
s.close();
// pattern 2
Session s = sessionFactory.openSession();
s.beginTransaction();
ObjectA A = s.load(ObjectA.class, pk);
A.setAttr("abc");
s.update(A);
s.close();
// pattern 3
Session s = sessionFactory.openSession();
Transaction tx = s.beginTransaction();
ObjectA A = s.load(ObjectA.class, pk);
A.setAttr("abc");
s.update(A);
tx.commit();
s.close();
请忽略我的编译错误。我在 Web 应用程序中使用 hibernate (没有 spring),并且没有使用事务,因为我正在使用 MySql 数据库和 MySql autocommit 是真的,所以反过来,在 hibernate 状态下,我也将其设为 autocommit true。 (我也在使用 mysql-connector-java-5.1.23-bin.jar)。
三个图案,我只能得到图案3的作品。我现在完全糊涂了。我有以下几个问题:
1) 我不明白为什么模式 1 不起作用,我所有的 select(通过 hibernate CriteriaBuilder 或 load)和 insert(通过 hibernate session.save)有效,但仅更新无效。
2) 好的,然后我尝试使用像模式 2 这样的事务,我的 hibernate auto-commit 是真的,所以我假设当我关闭 session 时,事务应该自动提交但它不会工作。为什么?
3) 模式 3 有效,为什么我在这里需要事务管理器?我希望 jdbc 在每个事务中执行每个查询(一个事务中的一个 sql),我不担心性能,但我必须在此处包含事务,为什么?
对于模式 1 和模式 2,我发现甚至没有生成 update 脚本(基于 hibernate 日志),问题不是因为生成了脚本而是提交失败。不明白为什么?请帮助...
附言:
经过一些尝试和错误后,总结一些要点以供将来引用:
1) Hibernate 只会在 session.flush() 被调用时生成 sql 脚本,而 tx.commit() 和 session.flush( ) 必须在事务 block 中调用。没有事务,它会导致异常。如果刷新模式为自动,则不需要显式刷新,commit() 将触发刷新。
2) Hibernate Transaction 不等同于数据库事务,经过一些尝试,我发现,如果 hibernate autocommit 为 false,是的,它们在功能上是等价的,相应的 begin transaction 脚本是通过 JDBC 生成的并发送到数据库(只是我的猜测)。如果 hibernate autocommit 为真,虽然我们在 hibernate Transaction tx = s.beginTransaction() 中声明它,但没有启动 begin transaction,所有查询都将自动提交并且 回滚 将不起作用。
3) 我的案例的原因是,session.save()(还有 select)在没有事务的情况下工作,它有点特殊,因为 save 必须被触发才能获取表标识符(主键),因此即使没有刷新也会生成 sql 脚本。
4) 对于模式 2,我误解了,autocommit 不是autocommit upon session closed,它的真正含义应该是autocommit upon each sql reach database。所以模式 2 将不起作用,因为没有 tx.commit,这意味着没有刷新,因此没有生成 sql 脚本。 (tx.commit是否会在session.close时自动调用,这取决于供应商实现,有些会回滚。)
结论,Hibernate 无论如何都需要事务 block 。
最佳答案
我觉得你有点困惑。事务 (org.hibernate.transaction) 不完全是一个数据库事务。 当您刷新 session (Session.flush)以将指令绑定(bind)在单个数据库事务中时,hibernate 使用此类对象。换句话说,不要混淆 Hibernate Session 和 DB session,但是不要混淆 hibernate Sessio 和 db connection。 最重要的是,通过 specificatio hibernate 只为包含在 hibernate 事务之间的内容生成 sql 代码。这就是模式 A 和 B 不起作用并且不生成 sql 代码的原因。更具体地说,模式 B 中的自动提交没有影响,因为永远不会生成 sql cod。此外,根据 hibernate 最佳实践,即使是简单的 select 指令,您也必须记住打开和关闭事务。顺便说一句,即使没有事务,选择也应该可以工作,但您可能会遇到一些麻烦。
为了更好地理解我们可以恢复架构的概念:
刷新 session 后发生的事情可以通过以下步骤恢复:
这只是一个小的回顾,但希望这对你有所帮助
关于java - 如果不在事务中,Hibernate session.update 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44067544/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/