2013-05-30 9 views
5

データベースとJMSキューで作業するので、JTATransactionManager(複数のリソース)を使用することに決めました。
私はJTATransactionManagerの何も
Glassfishの3.1.2.2
JTATransactionManagerがデータベースにコミットしていない

がdb.Iにコミットされ
にHibernate 4.2.1.Finalはそれがfine.Iにはない作品JPATransactionManagerを試してみました3.2.3.RELEASE春のフレームワークを使用していますJTATransactionManager.Anyのアイデアは何が間違っていますか?

これはこれはUserDao

@Repository 
public class UserDao extends GenericDaoJpa<User> 
{ 
public UserDao() 
{ 
    super(User.class); 
} 
} 

そして、これでJPA設定ファイルの一部

<jee:jndi-lookup id="dataSource" jndi-name="Test" /> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     p:packagesToScan="com.pinkshield.jpaTest.domain" 
     p:dataSource-ref="dataSource" 
     p:jpaPropertyMap-ref="jpaPropertyMap" 
     p:jpaVendorAdapter-ref="hibernateVendor" /> 


<util:map id="jpaPropertyMap"> 
    <entry key="hibernate.hbm2ddl.auto" value="validate" /> 
    <entry key="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" /> 
    <entry key="transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" /> 
    <entry key="transaction.manager_lookup_class" 
     value="org.hibernate.transaction.SunONETransactionManagerLookup" /> 
</util:map> 

<bean id="hibernateVendor" 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
    p:showSql="true" /> 

<tx:jta-transaction-manager /> 

<context:component-scan base-package="com.pinkshield.jpaTest" /> 

これは、JPA

のための私の一般的なダオです
package com.pinkshield.jpaTest; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

public class GenericDaoJpa<T> implements GenericDao<T> 
{ 

private Class<T> queryClass; 
protected EntityManager entityManager; 

@PersistenceContext 
public void setEntityManager(EntityManager entityManager) 
{ 
    this.entityManager = entityManager; 
} 

public GenericDaoJpa(Class<T> queryClass) 
{ 
    super(); 
    this.queryClass = queryClass; 
} 

public T getNewInstance() 
{ 
    try 
    { 
     return getQueryClass().newInstance(); 
    } 
    catch (InstantiationException e) 
    { 
     throw new RuntimeException("Error creating new instance of : " + getQueryClass().getName(), e); 
    } 
    catch (IllegalAccessException e) 
    { 
     throw new RuntimeException("Error creating new instance of : " + getQueryClass().getName(), e); 
    } 
} 

public Class<T> getQueryClass() 
{ 
    return queryClass; 
}  

public T get(Long id) 
{ 
    if (id == null) 
    { 
     return null; 
    } 
    else 
    { 
     return entityManager.find(queryClass, id); 
    } 
} 

@SuppressWarnings("unchecked") 
public List<T> getAll() 
{ 
    return entityManager.createQuery("select o from " + queryClass.getName() + " o").getResultList(); 
} 

public void save(T object) 
{ 
    entityManager.persist(object); 
} 

public void update(T object) 
{ 
    entityManager.merge(object); 
} 

public void delete(T object) 
{ 
    entityManager.remove(entityManager.merge(object)); 
} 

}

です私の役人です氷のコード

@Service 
public class UserServiceImpl implements IUserService{ 

@Autowired UserDao userDao; 

@Override 
@Transactional 
public void saveUser(String name, String lastName) 
    { 
    User user=new User(); 
    user.setLastName(lastName); 
    user.setName(name); 

    userDao.save(user); 
    } 
} 
+0

あなたのサービスはどのパッケージですか? – MarkOfHall

+0

@SteveHallはすべて同じパッケージに入っています – Emre

答えて

1

私はコンテキストxmlに<tx:annotation-driven/>を追加する必要があると思います。これはコンテキストポストプロセッサを実行し、@TransactionalのメソッドをAOPメソッドインターセプタでラップして、探しているトランザクションの動作を提供します。

+1

あなたは何とか見逃してしまったことを非常に明白に指摘しました。このために私はそれを投票していますが、まだそれで動作しません。 – Emre

関連する問題