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
Hibernate 使用Spring自动休眠事务管理?_Hibernate_Spring_Transactions_Dao - Fatal编程技术网

Hibernate 使用Spring自动休眠事务管理?

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

spring框架在事务处理方面走了多远?我读过的《Spring In Action》一书及其示例建议您创建不需要担心会话和事务管理的DAO方法,只需在XML中设置会话工厂和事务模板,然后将它们连接到DAO中即可。另一方面,SpringSource.org的文档表明,需要大量的XML和/或注释才能实现这一点

这里的真相是什么,我可以按照

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);
    }
 }