Problema com JPA e SQLServer

3 respostas
R

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

3 Respostas

R

Maracuja:
Vc não esta fazendo o flush.

http://download.oracle.com/javaee/5/api/javax/persistence/EntityManager.html

[]`s

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?

R

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? :smiley:

R

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.

Cara,confesso que eu estou seguindo “receita de bolo” nesse assunto,sempre usava assim em projetos anteriores e simplesmente funcionava :smiley: , se vc puder me dar uma luz ficaria bastante grato :smiley:

Criado 5 de maio de 2011
Ultima resposta 5 de mai. de 2011
Respostas 3
Participantes 1