java - session.getTransaction().commit() 是否在 hibernate 中关闭 session ?

标签 java hibernate

我是 hibernate 初学者,我只想知道对象是否仅与 session.close() 分离,还是与 session.getTransaction().commit() 分离。因为我无法从另一个事务更新对象,所以它会抛出一个异常。

这是我的代码。

package com.steve.hibernate.HibernateDemo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.steve.hibernate.HibernateDemo.entity.Student;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {
        SessionFactory sessionFactory = new Configuration().configure().addAnnotatedClass(Student.class)
                .buildSessionFactory();

        Session session = sessionFactory.getCurrentSession();

        session.beginTransaction();
        Student student = session.get(Student.class, 17);
        System.out.println(student);
        session.getTransaction().commit();

        session.beginTransaction();
        student.setFirstName("BOOM");
        session.getTransaction().commit();

        session.close();

        sessionFactory.close();

    }
}

输出:

Hibernate: select student0_.id as id1_0_0_, student0_.email as email2_0_0_, student0_.first_name as first_na3_0_0_, student0_.last_name as last_nam4_0_0_ from student student0_ where student0_.id=?
Student [id=17, firstName=BOOM, lastName=asd, email=asd@gmail.com]
Exception in thread "main" java.lang.IllegalStateException: Session/EntityManager is closed
    at org.hibernate.internal.AbstractSharedSessionContract.checkOpen(AbstractSharedSessionContract.java:357)
    at org.hibernate.engine.spi.SharedSessionContractImplementor.checkOpen(SharedSessionContractImplementor.java:138)
    at org.hibernate.internal.AbstractSharedSessionContract.beginTransaction(AbstractSharedSessionContract.java:449)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350)
    at com.sun.proxy.$Proxy33.beginTransaction(Unknown Source)
    at com.steve.hibernate.HibernateDemo.App.main(App.java:25)

如果对象可以从 session.close() 中分离出来,为什么我无法更新持久对象的值?

最佳答案

您无需初始化另一笔交易。获取学生后,请尝试在提交之前更新它,因为除非刷新模式设置为手动,否则事务可能会被刷新,就是这种情况。尝试在单个事务中执行此操作。

关于java - session.getTransaction().commit() 是否在 hibernate 中关闭 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57135448/

相关文章:

java - 如何从 jar 下的相对路径获取 URL?

c# - 使用什么库进行 XML SOAP 调度

javascript - 正则表达式不包含某些词

java - 将 hibernate-search 添加到现有系统的依赖项会导致 NoSuchFieldException

java - hibernate :如何修复 "identifier of an instance altered from X to Y"?

java - 自定义日志记录以在运行时收集消息

java - 即使路径/文件存在于 webapp 中,getRequestDispatcher 也返回 null

java - 结点中的 hibernate 总标准

java - 如何通过重用 cfg.xml 和 util 类连接多个数据库?

java - 将 LocalDateTime 设置为使用 hibernate 4.3.10 自动生成