【问题标题】:How do I set flush mode to "COMMIT" in my configuration files?如何在我的配置文件中将刷新模式设置为“COMMIT”?
【发布时间】:2012-10-26 21:59:21
【问题描述】:

我正在使用 Spring 3.1.1.RELEASE、Hibernate 4.1.0.Final 和 JPA 2.0。有没有一种方法可以在没有 Java 代码的情况下执行事务后配置 Spring 事务以提交?换句话说,我想将刷新模式设置为在应用程序上下文文件、休眠配置文件或 persistence.xml 文件中提交。我的 Spring 事务服务类看起来像

@Transactional(rollbackFor = Exception.class)
@Service
public class ContractServiceImpl implements ContractService
{

    @Autowired
    private ContractDAO m_contractDao;

    public void addContract(Contract contract)
    {
       m_contractDao.create(contract);
    }

    ...

我的应用程序上下文是这样设置的……

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:mem:myproject" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="persistenceXmlLocation" value="classpath*:META-INF/test-persistence.xml"/>
    <property name="persistenceUnitName" value="testingDatabase"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="sharedEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
   <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<tx:annotation-driven />

我的 persistence.xml 文件是

<persistence version="2.0"
   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_2_0.xsd">
        <persistence-unit name="testingDatabase" transaction-type="RESOURCE_LOCAL">
                <provider>org.hibernate.ejb.HibernatePersistence</provider>
                <properties>
                        <property name="hibernate.ejb.cfgfile" value="/hsql_hibernate.cfg.xml" />
        <property name="org.hibernate.FlushMode" value="commit" />
                </properties>
        </persistence-unit>
</persistence>

我的休眠配置文件是

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.pool_size">1</property>
        <property name="show_sql">true</property>
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
        <property name="hibernate.hbm2ddl.auto">create-drop</property>

        <mapping class="org.mainco.subco.sbadmin.domain.Product" />
        <mapping class="org.mainco.subco.sbadmin.domain.Contract" />
        <mapping class="org.mainco.subco.organization.domain.Country" />
        <mapping class="org.mainco.subco.organization.domain.State" />
        <mapping class="org.mainco.subco.organization.domain.Address" />
        <mapping class="org.mainco.subco.organization.domain.OrganizationType" />
        <mapping class="org.mainco.subco.organization.domain.Organization" />

    </session-factory>
</hibernate-configuration>

【问题讨论】:

    标签: spring hibernate jpa transactions flush


    【解决方案1】:

    在您的 web.xml 中尝试以下操作

    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>flushMode</param-name>
            <param-value>COMMIT</param-value>
        </init-param>
    </filter>
    

    Reference.

    【讨论】:

    • 嗨,关于这个答案,我没有 web.xml 文件。我的 Maven 项目构建了一个 JAR。它使用 Spring 库来执行事务,但没有 Web 组件。
    【解决方案2】:

    查看link

    你可能需要扩展

    org.springframework.orm.jpa.vendor.HibernateJpaDialect 
    

    我希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      作为另一种选择,您可以使用 org.hibernate.flushMode 配置设置直接将 Hibernate EntityManager 配置为默认使用特定的刷新模式。

      【讨论】:

      • 我应该在哪里添加它?我将该指令包含在我的 persistence.xml 文件中(参见问题编辑),但在我的 DAO 中调用“entityManager.getFlushMode()”仍返回“auto”。
      • 你必须调用 Hibernate Session 来确定效果(该设置会影响底层 Session):entityManager.unwrap( Session.class ).getFlushMode()
      • 它应该回想起来,可能也会影响本地 EntityManager 刷新模式。
      • 是的,我尝试了您建议的读取刷新模式的替代方法,但它仍然返回“AUTO”。
      【解决方案4】:

      我不确定这种设置在春季是否可用。 (我没见过)但是, 作为替代,hibernate 提供了通用 CRUD 方法,如果您将它们作为泛型传递,您可以将它们用于所有类。只需在 Update/Create 方法中调用 flush 方法,并专门使用这些方法来创建/更新您的所有类。

      这是一个例子:

      http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

      【讨论】:

      • 嗨,只有 b/c 我在我的问题中指定了“没有 Java 代码”,我会在四处搜索时推迟接受你的答案。举个例子,谢谢。
      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      相关资源
      最近更新 更多