Hibernate 使用Spring自动休眠事务管理?
spring框架在事务处理方面走了多远?我读过的《Spring In Action》一书及其示例建议您创建不需要担心会话和事务管理的DAO方法,只需在XML中设置会话工厂和事务模板,然后将它们连接到DAO中即可。另一方面,SpringSource.org的文档表明,需要大量的XML和/或注释才能实现这一点 这里的真相是什么,我可以按照Hibernate 使用Spring自动休眠事务管理?,hibernate,spring,transactions,dao,Hibernate,Spring,Transactions,Dao,spring框架在事务处理方面走了多远?我读过的《Spring In Action》一书及其示例建议您创建不需要担心会话和事务管理的DAO方法,只需在XML中设置会话工厂和事务模板,然后将它们连接到DAO中即可。另一方面,SpringSource.org的文档表明,需要大量的XML和/或注释才能实现这一点 这里的真相是什么,我可以按照 get session from sessionfactory open transaction preform database actions commit
get session from sessionfactory
open transaction
preform database actions
commit transaction with error handling
让它变得公正
preform database actions
将我在方法中拥有的boiler plate事务性代码的数量减少到最低程度?为了能够做到这一点,您应该做一些工作,但这并不多。据推测,您将使用JPA选择您自己的提供商,例如Hibernate。然后需要将定义持久性单元的persistence.xml放在META-INF文件夹中:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="YourDatabasePersistenceUnitName" transaction-type="RESOURCE_LOCAL"/>
</persistence>
其中,用户是由应用程序定义的JPA实体。您可以在调用DAO的管理器/控制器层管理事务—事实上我就是这样做的—但我在这里将其放在一起,以避免使示例过于混乱
很好的参考资料,你可能想直接去,而不是我的例子是
它引用的前3个链接也值得一看。Spring提供了至少3种事务划分方法: 1) 通过TransactionTemplate或PlatformTransactionManager进行编程处理-配置时亮起,但具有侵入性 2) 通过XML声明的-详细的XML,但非侵入性 3) 通过注释的声明性-针对XML,而非侵入性 您选择哪一个取决于哪一个最适合您的需要,Spring不会为您做出选择。从你的问题来看,你所追求的似乎是注释方法 我建议阅读Spring参考手册,注释驱动事务处理部分。它清晰简洁
我总是先查阅参考文档,只有文档中没有的书我才会查阅。谢谢你的回答,我明天在工作中会玩这个。但是,最后的两个链接都是相同的。对不起,我提供的链接包含了另外3个链接,包括我想到的另一个链接…除了bean之间明显的依赖关系之外,xml顺序应该不重要。这篇博文似乎已经死了。你能推荐另一个帖子吗?
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" scope="singleton">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="YourDatabasePersistenceUnitName"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="showSql" value="true"/>
<property name="generateDdl" value="false"/>
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
@Repository
@Transactional
public class UserJpaDAO {
protected EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void save(User theUser) {
entityManager.persist(theUser);
}
public User update(User theUser) {
return entityManager.merge(theUser);
}
}