2012-04-03 7 views
1

JPAでHibernateを使用しています。私は@Transactionalで注釈クラスを持ち、このクラス内で私はいくつかのオブジェクトを永続:@TransactionalおよびentityManager.persist(o);

@Transactional 
@Repository 
public class ImageRepository { 
    @Autowired 
    private EntityManager em; 

    public Image factory(String imageHash) { 
     Image image = new Image(); 
     image.setHash(imageHash); 
     em.persist(image); 
     return image; 
    } 
} 

私はHibernateはselect nextval ('hibernate_sequence')の画像オブジェクトのIDを割り当てることがわかります。しかし、それはすべてです。オブジェクトは、データベースに格納されることはありませんし、私はem.flush();を実行しようとすると、私は取得しています:

javax.persistence.TransactionRequiredException: no transaction is in progress 

はまた、私はすべてのエラーを取得しておりません。

私のアプリケーションコンテキスト:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.1.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <context:annotation-config/> 
    <context:spring-configured/> 
    <context:property-placeholder location="classpath:application.properties"/> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

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

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="persistenceUnit"/> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">${database.dialect}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${database.structure}</prop> 
       <prop key="hibernate.connection.url">${database.connection}</prop> 
       <prop key="hibernate.connection.username">${database.username}</prop> 
       <prop key="hibernate.connection.password">${database.password}</prop> 
       <prop key="hibernate.connection.driver_class">${database.driver}</prop> 
       <prop key="hibernate.connection.shutdown">true</prop> 
       <prop key="hibernate.connection.writedelay">0</prop> 
       <prop key="hibernate.show_sql">${database.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
</beans> 

とのpersistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<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="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    </persistence-unit> 
</persistence> 

私はいくつかのオブジェクトをマージしようとすると、同じことが起こります。

ありがとうございます!

EDIT 3:

(以前の編集は関係ありませんでした)

私は気づいた、私はDWR(DirectWebRemoting)サーブレットからオブジェクトを永続化または編集するとき、私は問題がないこと。私自身のサーブレットから同じことをしようとすると、私は問題を述べています。しかし、私のサーブレットのすべてのBeanは、コンポーネントスキャンと@Componentや@Repositoryのようなアノテーションを使ってSpringによって作成されています。だから私はそのような問題を抱えている必要はありません。

答えて

2

@Transactionalは春の一部です。あなたのコードはSpring contextを使用していないようです。

@Transactional注釈が機能するためには、Springコンテキストによって 包まされている必要があり、 ImageRepository.factory()メソッドを使用します。

+0

私は、主なapplicationContextではしか持っていますが、servlet-applicationContextではありません。今それは正しく動作します。ヒントありがとう! –