2012-11-06 1 views
5

Я использую Spring 3.1.1.RELEASE, Hibernate 4.1.0.Final и JPA 2.0. Есть ли способ настроить транзакции Spring для фиксации после выполнения транзакций без кода Java? Другими словами, я хотел бы установить режим флеша для фиксации в файле контекста приложения, в файле конфигурации спящего режима или в файле persistence.xml. Моя весна класс обслуживания сделка выглядитКак установить режим очистки в «COMMIT» в конфигурационных файлах?

@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> 

ответ

2

Проверить это link

Вы, возможно, потребуется расширить

org.springframework.orm.jpa.vendor.HibernateJpaDialect 

Я надеюсь, что это помогает!

0

Я не уверен, что этот тип настроек доступен весной. (Я его еще не видел). Но в качестве альтернативного спящего режима предоставляет общие методы CRUD, которые вы можете использовать для всех своих классов, если вы передадите их как обобщенные. Просто поставьте вызов методу flush в методах Update/Create и используйте их исключительно для создания/обновления всех ваших классов.

Вот пример:

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

+0

Привет, Только b/c Я указал «без кода Java» в своем вопросе, я собираюсь удержаться, чтобы принять ваш ответ во время поиска. Thx для примера, tho. – Dave

2

Попробуйте следующее в вашем 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.

+0

Привет, В отношении этого ответа у меня нет файла web.xml. Мой проект Maven создает JAR. Он использует библиотеки Spring для выполнения транзакций, но не имеет веб-компонента. – Dave

1

В качестве другого варианта вы можете настроить Hibernate EntityManager напрямую, чтобы использовать определенный режим очистки по умолчанию, используя настройку конфигурации org.hibernate.flushMode.

+1

Где я должен добавить это? Я включил эту директиву в свой файл persistence.xml (см. Редактирование вопроса), но вызовы в "entityManager.getFlushMode()" внутри моего DAO все еще возвращают "авто". – Dave

+0

Вам нужно будет вызвать сеанс Hibernate для определения эффекта (этот параметр влияет на базовый сеанс): 'entityManager.unwrap (Session.class) .getFlushMode()' –

+0

Необходимо в ретроспективе, возможно, воздействовать на локальный поток EntityManager режим. –

 Смежные вопросы

  • Нет связанных вопросов^_^