- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我编写了一个示例 Spring Hibernate 应用程序以了解 Spring Hibernate 集成的工作原理。
这是我的 applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<context:component-scan base-package="com.general" />
<tx:annotation-driven />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="system" />
<property name="password" value="admin_123" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean ">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="com.general"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
那么,我的服务类就是这样
package com.general;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional
public void saveEmployee(Employee emp) {
Session session = sessionFactory.getCurrentSession();//.openSession();
session.save(emp);
}
}
我的主课是
public class App {
public static void main(String[] args) {
System.out.println("load context");
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Employee em = new Employee();
em.setId(1l);
em.setName("John");
EmployeeService emService = (EmployeeService) context.getBean("employeeService");
emService.saveEmployee(em);
}
}
如果我使用 getCurrentSession 方法运行此应用程序,那么它运行良好并且员工被保存到数据库中,但是如果我使用 openSession 方法,则不会触发任何 SQL 查询,因此不会将任何内容保存到数据库中。
我不确定为什么会这样。可能是我对getCurrentSession()和openSession()没有正确的理解。可以请有人告诉我背后的原因。
最佳答案
事实上你有 @Transactional
关于 @Service
中的方法带注释的类以及 TransactionManager
意味着整个事务生命周期将由 Spring 管理。
当您的 saveEmployee
方法被调用,Spring会打开一个Session
,开始交易,执行代码,提交交易并关闭 Session
. Session
它开始绑定(bind)到当前线程并通过 getCurrentSession()
可用。 .
如果您改为使用 openSession()
,您正在打开一个完全不相关的 Session
, 不受 Spring 的 TransactionManager
管理.因此,事务不会被提交并且 Session
除非你自己做,否则不会关闭。
关于java - 为什么 openSession 不起作用但 getCurrentSession 在 Spring Hibernate 中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067307/
堆栈跟踪: java.lang.NullPointerException at de.mail.HibernateUtil.getSession(HibernateUtil.java:30) at d
我正在尝试将 Hibernate 4.1 与 Spring 3.1.3 集成。 //configuration file (beans.xml) org.
我是 spring 和 hibernate 的新手,一切正常,但我检查了每次调用 getCurrentSession 时,在 mysql 中创建了一个新的连接线程,该线程进入休眠状态。据我所知,这不是
我需要了解使用 Hibernate.getCurrentSession() 的最佳情况? 我的理解是,它在像 WebApplication(Spring MVC)这样的多线程环境中是有害的,因为在任何
我正在尝试利用 Hibernate,并尝试通过利用 API SessionFactory 提供的 getCurrentSession() 来避免 session 管理。据我了解,这将为我管理 sess
我正在尝试使用 generic-dao ( http://code.google.com/p/hibernate-generic-dao/ )。但是,在我的 HibernateBaseDAO 中,ge
通过 SessionFactory.getCurrentSession() 获取 Hibernate session 是否线程安全?假设我有一个 static SessionFactory 对象用于我
我正在使用 hibernate 和 jsp/servlet 编写一个基于 Web 的应用程序。我已经阅读了 sessionFactory.getCurrentSession 和 sessionFact
我有一个问题,当我在 DAO 文件中调用 addCus() 方法时,我得到 NullPointerException。我尝试了很多解决方案,但仍然出现此错误。为什么 getCurrentSession
在Hibernate4中,Spring4 我想使用没有sessionFactory.getCurrentSession()批注的@Transactional。有什么办法吗? 最佳答案 简单的答案是:是
我正在使用 Maven、Spring 和 Hibernate 做一个基于 Web 的项目。我刚刚遇到了一个问题。问题是每当我使用 sessionFactory.getCurrentSession()
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 当我将文件作为 JUnit 测试
我正在单元测试中全面测试一个实体,到目前为止几乎一切正常:创建、更新、列表。但是,当我尝试删除一条记录时,它并没有被删除。这是我正在使用的代码: public void delete (Integ
我有一个简单的 Java Web 应用程序,它从数据库接收一些信息并在 Web 浏览器中显示该信息。 Hibernate 用于与 servlet 和 jsp 文件中的数据库进行交互。一切都如我所愿,但
这个问题在这里已经有了答案: Hibernate openSession() vs getCurrentSession() (5 个答案) 关闭 6 年前。 OpenSession() 总是打开一个
您好,我已经使用 hibernate 配置了带有事务管理器的 sessionFactory 和 MysqL 数据源。当我尝试在 openSession() 之后立即对该工厂调用 getCurrentS
这是我的代码: hibernate .cfg.xml com.mysql.jdbc.Driver jdbc:mysql://localhost:3306
我是 N hibernate 的新手。我在我的应用程序中使用 n hibernate 。我编写的代码运行成功但有点慢,因为当我检查 hibernate 分析器时,它向我展示了进程缓慢的一些原因。“每个
Servlet 3.0 异步 API 的内部指定 Servlet 由线程多路复用器池处理。 getCurrentSession 的行为是什么?它会让 session 保持打开状态,直到多路复用器线程因
因此,我在事务内部使用 Hibernate SessionFactory 及其 getCurrentSession 方法已经有一段时间了。 Session session = sessionFacto
我是一名优秀的程序员,十分优秀!