2013-05-30 15 views
5

Lavorerò con un database e con una coda JMS, quindi ho deciso di utilizzare JTATransactionManager (più risorse).
Sto usando il framework Spring 3.2.3.RELEASE
Hibernate 4.2.1.Final
Glassfish 3.1.2.2
JTATransactionManager Non commit al database

Con JTATransactionManager nulla si impegna a db.I cercato JPATransactionManager funziona fine.I non lo fanno ottenere eventuali eccezioni con JTATransactionManager.Qualsiasi idea di cosa sto facendo male? Grazie.

Questo è un pezzo di file di configurazione 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" /> 

Questo è il mio Dao generico per APP

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

}

Questo è UserDao

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

E questo è il mio servizio ghiaccio codice

@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

In che pacchetto è il vostro servizio? – MarkOfHall

+0

@SteveHall tutti nello stesso pacchetto – Emre

risposta

1

Credo che è necessario aggiungere <tx:annotation-driven/> al contesto xml. Questo eseguirà un post processore del contesto che avvolgerà i metodi con @Transactional con un intercettore di metodo AOP che fornisce il comportamento della transazione che stai cercando.

+1

hai sottolineato qualcosa di abbastanza ovvio che mi sono perso in qualche modo. Per questo sto votando ma non funziona ancora con esso. – Emre