Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我需要在此中添加事务?_Java_Hibernate_Jpa_Orm_Transactions - Fatal编程技术网

Java 为什么我需要在此中添加事务?

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

为什么我们总是需要在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=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配置,这是 如果执行此操作会发生什么 片段:

  • 将打开一个新会话。此时无法获取数据库连接 重点
  • 对get()的调用触发SQL选择。会话现在获得一个JDBC 来自连接池的连接。 默认情况下,立即休眠 关闭此服务器上的自动提交模式 与setAutoCommit的连接(错误)。 这实际上启动了一个JDBC 成交
  • SELECT在这个JDBC事务中执行。会议正在进行中 关闭,然后返回连接 到池中并由Hibernate释放 -Hibernate在JDBC上调用close() 联系这辆车怎么了 未提交的交易
  • 这个问题的答案是:“它 取决于JDBC规范 没有说任何关于未决的事情 调用close()时的事务 联系。发生什么取决于 供应商如何实施 规格使用oraclejdbc 驱动程序,例如,调用 close()提交事务!最 其他JDBC供应商采取了明智的做法 并回滚任何挂起的事务 当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配置,这是 如果执行此操作会发生什么 片段:

  • 将打开一个新会话。此时无法获取数据库连接 重点
  • 对get()的调用触发SQL选择。会话现在获得一个JDBC 来自连接池的连接。 默认情况下,立即休眠 关闭此服务器上的自动提交模式 与setAutoCommit的连接(错误)。 这实际上启动了一个JDBC 成交
  • SELECT在这个JDBC事务中执行。会议正在进行中 关闭,然后返回连接 到池中并由Hibernate释放 -Hibernate在JDBC上调用close() 联系这辆车怎么了 未提交的交易
  • 这个问题的答案是:“它 取决于JDBC规范 没有说任何关于未决的事情 调用close()时的事务 联系。发生什么取决于 供应商如何实施 规格使用oraclejdbc 驱动程序,例如,调用 close()提交事务!最 其他JDBC供应商采取了明智的做法 并回滚任何挂起的事务 当JDBC连接对象是 已关闭,资源将返回到 游泳池

    显然,这对我们来说不是问题 您已执行的选择,但请看 在这种变化下:

    Session session = getSessionFactory().openSession(); 
    Long generatedId = session.save(item); 
    session.close(); 
    
    此代码导致插入 语句,在 从未提交或删除的事务 向后滚。在甲骨文上,这篇文章 代码永久插入数据;在里面 其他数据库,它可能不会。(本 情况稍有好转 复杂:执行插入 仅当标识符生成器 需要它。例如,一个 标识符值可以从 没有插入的序列。 然后将持久实体排队,直到 刷新时间插入-从不 在此代码中发生。标识 战略需要立即插入 对于要生成的值。)

    博托