Galera,tenho um cadastro que utiliza um DAO genérico para salvar os dados no banco.Quando dou um persist(),nenhum erro é mostrado,se eu der um ‘findByID’ é retornado o registro que tentei inserir,mas o registro não consta no banco,o que pode estar errado?
Segue o código:
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public T salvar(T object) {
getEntityManager().clear();
try {
getEntityManager().persist(object);
System.out.println(getEntityManager().contains(object));
}catch(Exception e){
e.printStackTrace();
}
ApplicationContext ctx = AppContext.getApplicationContext();
ChamadoTecnicoDAO dao = (ChamadoTecnicoDAO)ctx.getBean("chamadoTecnicoDAOImp");
ChamadoTecnico cht = (ChamadoTecnico)dao.findById(new Long(110500132));//retornando OK
return object;
}
[quote=Maracuja]Vc não esta fazendo o flush.
http://download.oracle.com/javaee/5/api/javax/persistence/EntityManager.html
[]`s
[/quote]
Mas pq eu precisaria nesse caso,tendo em conta que essa eh uma solução que funciona bem em várias aplicações,com bancos diferentes?
Bem,este é o contexto:
Minha aplicação acessa dois bancos SqlServer,estou usando o Spring para gerenciar as transações e esse é o arquivo de configuração:
<?xml version="1.0" encoding="UTF-8"?>
<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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:property-placeholder location="/WEB-INF/application.properties" />
<bean id="persistenceUnitManager"
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:META-INF/persistence_DBSSS.xml</value>
<value>classpath*:META-INF/persistence_DBCSH.xml</value>
</list>
</property>
<property name="dataSources">
<map>
<entry key="dataSource1" value-ref="dataSource_DBSSS" />
<entry key="dataSource2" value-ref="dataSource_DBCSH" />
</map>
</property>
</bean>
<bean id="entityManagerFactory_DBSSS"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="pu_DBSSS" />
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
</bean>
<bean id="entityManagerFactory_DBCSH"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="pu_DBCSH" />
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
</bean>
<bean id="dataSource_DBSSS" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${dbsss.url}" />
<property name="username" value="${dbsss.username}" />
<property name="password" value="${dbsss.password}" />
</bean>
<bean id="dataSource_DBCSH" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${dbcsh.url}" />
<property name="username" value="${dbcsh.username}" />
<property name="password" value="${dbcsh.password}" />
</bean>
<bean id="txManager_DBSSS" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory_DBSSS" />
</bean>
<bean id="txManager_DBCSH" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory_DBCSH" />
</bean>
<tx:annotation-driven transaction-manager="txManager_DBSSS" />
<tx:annotation-driven transaction-manager="txManager_DBCSH" />
<bean
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="contextApplicationContextProvider" class="context.ApplicationContextProvider" />
<context:component-scan base-package="*" />
</beans>
para cada implementação do DAO eu preciso indicar explicitamente qual persistence unit vou usar:
@PersistenceContext(unitName="pu_DBCSH")
public EntityManager entityManager;
Esse é o método salvar ‘genérico’,que funciona em outras apps sem o flush:
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public T salvar(T object) {
getEntityManager().clear();
try {
getEntityManager().persist(object);
}catch(Exception e){
e.printStackTrace();
}
return object;
}
Esse é o método salvar em que tentei colocar o flush explicito:
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public T salvar(T object) {
getEntityManager().clear();
try {
getEntityManager().getTransaction().begin();
getEntityManager().persist(object);
getEntityManager().flush();
getEntityManager().getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
}
return object;
}
Que está retornado o seguinte erro:
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
Alguma idéia? 
[quote=Maracuja]Olá, agora vc está complicando tudo, vc agora esta tentando utilizar JPA transaction managment programaticamente e Spring transaction managment declarativamente (anotations), isso certamente não vai funcionar. heheheh Vc deve usar uma coisa, ou outra.
[/quote]
Cara,confesso que eu estou seguindo “receita de bolo” nesse assunto,sempre usava assim em projetos anteriores e simplesmente funcionava
, se vc puder me dar uma luz ficaria bastante grato 