Java 为什么我需要在此中添加事务?
为什么我们总是需要在hibernate中启动事务来保存、插入、删除或更新 hibernate中的自动提交功能默认为false吗 像这样Java 为什么我需要在此中添加事务?,java,hibernate,jpa,orm,transactions,Java,Hibernate,Jpa,Orm,Transactions,为什么我们总是需要在hibernate中启动事务来保存、插入、删除或更新 hibernate中的自动提交功能默认为false吗 像这样 public static void main(String[] args) { System.out.println("creating empopbjects"); emp e1=new emp("a","x",1234); emp e2=new emp("b","y",324); emp e3
public static void main(String[] args) {
System.out.println("creating empopbjects");
emp e1=new emp("a","x",1234);
emp e2=new emp("b","y",324);
emp e3=new emp("c","z",23345);
System.out.println("saving emp objects..");
Session s=myfactory.getsession();
s.save(e1);
s.save(e2);
s.save(e3);
s.close();
System.out.println("successfully saved");
}
这不会保存任何内容,但如果我添加事务,则只添加它?为什么
public static void main(String[] args) {
System.out.println("creating empopbjects");
emp e1=new emp("a","x",1234);
emp e2=new emp("b","y",324);
emp e3=new emp("c","z",23345);
System.out.println("saving emp objects..");
Session s=myfactory.getsession();
Transaction t =s.beginTransaction();
s.save(e1);
s.save(e2);
s.save(e3);
t.commit();
s.close();
System.out.println("successfully saved");
}
Hibernate会话是一个会话,查询仅在刷新时间执行(可能发生在执行任何查询之前,或者在提交当前正在执行的事务时)
自动提交仅在SQL控制台中有意义,在企业应用程序中是不可取的。使用ORM工具时,您要管理实体对象状态转换,而不是执行DML操作。只有在刷新时,状态转换才会转换为DML操作
因此,虽然您可以在自动提交中编写JDBC语句,但JPA不允许您这样做。Hibernate会话是一个会话,并且查询只在刷新时执行(可能在执行任何查询之前,或者在提交当前执行的事务时执行)
自动提交仅在SQL控制台中有意义,在企业应用程序中是不可取的。使用ORM工具时,您要管理实体对象状态转换,而不是执行DML操作。只有在刷新时,状态转换才会转换为DML操作
因此,虽然您可以在自动提交中编写JDBC语句,但JPA不允许您这样做。这里是您问题的明确答案 请看下面的代码,其中 访问数据库时不使用 交易边界:
Session session = sessionFactory.openSession();
session.get(Item.class, 123l);
session.close();
默认情况下,在JavaSE环境中
对于JDBC配置,这是
如果执行此操作会发生什么
片段:
Session session = getSessionFactory().openSession();
Long generatedId = session.save(item);
session.close();
此代码导致插入
语句,在
从未提交或删除的事务
向后滚。在甲骨文上,这篇文章
代码永久插入数据;在里面
其他数据库,它可能不会。(本
情况稍有好转
复杂:执行插入
仅当标识符生成器
需要它。例如,一个
标识符值可以从
没有插入的序列。
然后将持久实体排队,直到
刷新时间插入-从不
在此代码中发生。标识
战略需要立即插入
对于要生成的值。)
底线:使用明确的事务划分。这里是您问题的明确答案 请看下面的代码,其中 访问数据库时不使用 交易边界:
Session session = sessionFactory.openSession();
session.get(Item.class, 123l);
session.close();
默认情况下,在JavaSE环境中
对于JDBC配置,这是
如果执行此操作会发生什么
片段:
Session session = getSessionFactory().openSession();
Long generatedId = session.save(item);
session.close();
此代码导致插入
语句,在
从未提交或删除的事务
向后滚。在甲骨文上,这篇文章
代码永久插入数据;在里面
其他数据库,它可能不会。(本
情况稍有好转
复杂:执行插入
仅当标识符生成器
需要它。例如,一个
标识符值可以从
没有插入的序列。
然后将持久实体排队,直到
刷新时间插入-从不
在此代码中发生。标识
战略需要立即插入
对于要生成的值。)
博托