【问题标题】:JTATransactionManager Not Committing To DatabaseJTATransactionManager 未提交到数据库
【发布时间】:2013-05-26 05:36:58
【问题描述】:

我将使用数据库和 JMS 队列,因此我决定使用 JTATransactionManager(多种资源)。
我正在使用 Spring Framework 3.2.3.RELEASE
休眠 4.2.1.Final
Glassfish 3.1.2.2

使用 JTATransactionManager,没有任何东西被提交给 db。我尝试了 JPATransactionManager,它工作正常。我没有得到 JTATransactionManager 的任何异常。知道我做错了什么吗?谢谢。

这是一个 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));
}

}

这是用户道

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

这是我的服务代码

 @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);
   }
 }

【问题讨论】:

  • 你的服务在什么包里?
  • @SteveHall 都在同一个包中
  • @Emre 我知道已经很久了,但是你能解决这个问题吗?

标签: spring hibernate glassfish-3 spring-transactions


【解决方案1】:

我认为您需要将 &lt;tx:annotation-driven/&gt; 添加到上下文 xml。这将运行一个上下文后处理器,该处理器将使用 @Transactional 包装方法,并使用提供您正在寻找的事务行为的 AOP 方法拦截器。

【讨论】:

  • 你指出了一些我以某种方式错过的非常明显的事情。为此,我正在投票,但它仍然无法使用。
猜你喜欢
  • 2019-06-18
  • 2012-12-15
  • 2011-03-21
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多