2016-08-29 21 views
0

私は同様の質問をよく受けましたが、一般的に答えは@Transactionalをクラスとメソッドに追加することです。しかし、これは私のために働いていないので、私は何か間違ったことをやっていると思いますか?Spring Web App + JPA利用可能なトランザクションEntityManagerはありません

MyRepository:

@Repository 
public class MyRepository extends AbstractRepository<MyEntity> implements org.springframework.data.repository.Repository<MyEntity, Long> { 

    @PersistenceContext 
    private EntityManager em; 

    public MyRepository() { 
     super(MyEnitiy.class); 
    } 

    @Override 
    public EntityManager getEntityManager() { 
     return em; 
    } 

    @SuppressWarnings("unchecked") 
    @Transactional 
    public List<MyEnitiy> getAllFor(Integer id) {   
     return getEntityManager().createQuery("SELECT k FROM MyEntity k WHERE k.otherid = :otherid ORDER BY k.something", MyEntity.class) 
      .setParameter("otherid", id).getResultList(); 
    } 
} 

AbstractRepository:

@Transactional(readOnly = true) 
public abstract class AbstractRepository<T> { 

    ... 
    @Modifying 
    @Transactional 
    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 
    ... 
} 

マイSPINGウェブコントローラ(スニペット):

@Controller 
public class MyController { 
    @Autowired 
    private MyRepository myRepository; 

    @RequestMapping(value = {"/here/there"}, method = RequestMethod.GET) 
    @ResponseBody 
    @Transactional 
    public String hereAndTherePage(@RequestParam(value = "id", required = true) Integer id, 
      HttpServletRequest request, HttpSession session) { 
     List<MyEntity> myEntities = myRepository.getAllFor(id); 
     for(MyEntity myEntity : myEntities) { 
      ... 
      myEntity.setSomeValue(myEntity.getSomeValue() + 1); 
      ... 
      myRepository.edit(myEntity); 

更新:

春-database.xml(プールの使用は、Tomcatのメモリリークを試してみて、修正するための試みであった):

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

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="com.example.*" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="MYSQL" /> 
      <property name="generateDdl" value="true" /> 
     </bean> 
    </property> 
</bean> 

<bean id="poolProperties" class="org.apache.tomcat.jdbc.pool.PoolProperties"> 
    <property name="url" value="jdbc:mysql://localhost:3306/bfwinkel?noAccessToProcedureBodies=true"/> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="validationQuery" value="SELECT 1"/> 
    <property name="testOnBorrow" value="true"/> 
    <property name="jdbcInterceptors" value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"/> 
    <property name="maxActive" value="10"/> 
    <property name="maxIdle" value="10"/> 
    <property name="username" value="d[-.-]b"/> 
    <property name="password" value="~!~"/> 
</bean> 

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> 
    <property name="poolProperties" ref="poolProperties"/> 
</bean> 

getEntityManager().merge(entity);が呼び出されたときに例外がスローされ

javax.persistence.TransactionRequiredException: No transactional EntityManager available 
+0

あなたの春、database.xmlに以下の行を追加しますが、 'EntityManager' Beanを定義していますか? – nowszy94

+0

エンティティマネージャーBeanとトランザクションマネージャーBeanを使用してspring xmlを投稿してください。 – javafan

答えて

1

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

<tx:annotation-driven transaction-manager="txManager" /> 
+0

以下はサンプルコードですhttp://tarunjain-jaintarun.blogspot.de/2016/06/csv-reader-and-jpa-example.html –

+0

ありがとうあなた、これは私の問題を解決しました。 – TungstenX

0

このエラーは、エンティティをマージしようとすると利用可能な永続コンテキストがないことを意味します。

この問題を優先的に解決する方法は3つあります。

1- @EnableTransactionManagementを設定に追加しましたか?

2- persistence.xmlファイルがある場合、@PersistenceContextにunitname属性を追加する必要があります。

3トランザクションスコープの永続コンテキストの代わりに拡張永続コンテキストを使用します。

私の答えがあなたを助けてくれることを願います。

幸運

+0

ありがとうございます。私はpersistence.xmlファイルを持っていますが、unitNameを@PersistenceContextに置いたときにBeanが存在しない場合は、まだ何かを呼び出す必要があります。 – TungstenX

+0

ニュースはありますか?あなたの問題を解決しますか? –

+0

まだありませんが、私のために働いているようです(unitNameなし) – TungstenX

関連する問題