Fórum Problema Persistencia JSF 2+Spring 3+JPA #417385

24/05/2012

0

Puts pessoal to com um problema estranho...
o trem tema configuração que mencionei no titulo, mas so faz perquisa e alteração, persistencia de um novo resgistro não faz... olhem minha configuração:
Entidade:

@Entity
@Table(name = PAIS)
public class Pais implements Identificavel<Long> {

	/** */
	private static final long serialVersionUID = 8615329059375862033L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = ID)
	private Long id;

	@NotNull(message=notnull)
	@NotEmpty
	@Label(lblPais)
	@Column(name = NOME)
	private String nome;

	@NotNull(message=notnull)
	@NotEmpty
	@Label(lblSiglaPais)
	@Column(name = SIGLA)
	private String sigla;

	@Column( name = PADRAO )
	@Label( lblPadrao )
	private boolean padrao;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = pais)
	@OrderBy(value = nome)
	private List<Estado> estados;

//metodos gets e sets
}



Metodos salvar e alterar:

@Component
public class PaisRepositoryImpl extends CrudRepositoRIO<Pais> implements
		PaisRepositorio, Serializable {
// método alterar país
	@Override
	public Pais alterar(Pais entity) throws BusinessException {
		Pais p = super.alterar(entity);
		getEntityManager().flush();
		return p;
	}

	// método inserir país
	@Override
	public Pais cadastrar(Pais pais) throws BusinessException {
		// entityManager.getTransaction().begin();
		// entityManager.persist(pais);
		// entityManager.getTransaction().commit();
		Pais p = super.cadastrar(pais);
		return p;
	}

}


Wisley Souza

Wisley Souza

Responder

Posts

24/05/2012

Wisley Souza

Fachada:

@Component(controllerCadastro)
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = BusinessException.class)
public class CadastroFacadeImpl implements CadastroFacade, Serializable {

	private static final long serialVersionUID = -3831130939388543469L;

	@Resource
	PaisRepositorio repositorio;

@Override
	public Pais cadastrarPais(Pais pais) throws Exception {
		// UPPER CASE
		pais.setNome(pais.getNome().toUpperCase());
		pais.setSigla(pais.getSigla().toUpperCase());

		return repositorio.cadastrar(pais);
	}

	@Override
	public Pais alterarPais(Pais pais) throws Exception {

		// UPPER CASE
		pais.setNome(pais.getNome().toUpperCase());
		pais.setSigla(pais.getSigla().toUpperCase());

		return paisReposytory.alterar(pais);
	}




config spring:


<?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
	xmlns:util=http://www.springframework.org/schema/util
	xmlns:jee=http://www.springframework.org/schema/jee
	xsi:schemaLocation=
		     http://www.springframework.org/schema/beans 
		     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		     http://www.springframework.org/schema/context
		     http://www.springframework.org/schema/context/spring-context-3.0.xsd
		     http://www.springframework.org/schema/tx
		     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
		     http://www.springframework.org/schema/aop 
		     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd>

	<context:annotation-config />
	<tx:annotation-driven transaction-manager=txManager />	

	<context:component-scan base-package=br.com.projeto />


	<!-- Gerenciador de transacoes baseado em JPA -->
	<bean id=txManager class=org.springframework.orm.jpa.JpaTransactionManager>
		<property name=entityManagerFactory ref=entityManagerFactory />
	</bean>
     <!-- banco desenv -->

    // dados do banco, que no caso é SQL SERVER


<!-- Fabrica de entity managers --> 
	<bean id=entityManagerFactory class=org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean>
		<property name=dataSource ref=myDataSource />
		<property name=persistenceUnitName value=ilog />				
		<property name=jpaVendorAdapter>
			<bean class=org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
				<property name=showSql value=true />
 				<property name=generateDdl value=true />
 				<property name=databasePlatform value=org.hibernate.dialect.SQLServerDialect />				
			</bean>
		</property>  		
	</bean>
	
	
	<bean id=myAspect class=br.com.projeto.classe/>
	
	<import resource=classpath:/META-INF/myview-spring-init.xml/>
	<bean id=persistentContextFactory
      class=org.apache.myfaces.orchestra.conversation.spring.JpaPersistenceContextFactory>
        <property name=entityManagerFactory ref=entityManagerFactory/>
	</bean>
</beans>



Responder

Gostei + 0

24/05/2012

Robson Teixeira

favor postar o log do erro.
Responder

Gostei + 0

24/05/2012

Davi Costa

Não tem erro, isso é problema do spring.
É problema no Transacional.
Já havia citado em outra thread, add ao seu xml (se adicionar isso ao seu xml não vai precisa de anotações @Transactional - parece que vc usa além da fachada usa uma camada DAO esse DAO é pacote que vc deve sinalizar no exemplo abaixo):

<tx:advice id=txAdvice>
<!-- configuracoes das transacoes -->
<tx:attributes>
<!-- todos os metodos que comecam com select e find sao read-only
<tx:method name=select*
propagation=SUPPORTS read-only=true />
<tx:method name=find*
propagation=SUPPORTS read-only=true/> -->
<!-- Os outros metodos possuem requerem uma transacao -->
<tx:method name=*
propagation=REQUIRED />
</tx:attributes>
</tx:advice>

<aop:config>
<!-- Todos as instancias das classes que fazem parte do pacote service, independente da
hierarquia, terao os metodos gerenciados -->
<aop:pointcut id=serviceMethods
expression=execution(* seu.pacote.service..*.*(..)) />
<aop:advisor advice-ref=txAdvice
pointcut-ref=serviceMethods />
</aop:config>

Deixei esse trecho todo comentado abaixo para que todos seus métodos sejam transacionais, apesar de não gostar, fiz só mesmo para facilitar para você.

E no problema dos seus fontes citados acima quem realmente precisa do @Transactional é a classe PaisRepositoryImpl

att Davi
Responder

Gostei + 0

25/05/2012

Wisley Souza

Eu fiz oque vc falou, mas ta dando este erro:

java.lang.IllegalStateException: BeanFactory not initialized or already closed - call refresh before accessing beans via the ApplicationContext
Responder

Gostei + 0

25/05/2012

Davi Costa

posta como está seu xml e sua classe que realmente chama o entitymanager


att Davi
Responder

Gostei + 0

25/05/2012

Wisley Souza

Spring-config:



<?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 xmlns:util=http://www.springframework.org/schema/util
	xmlns:jee=http://www.springframework.org/schema/jee
	xsi:schemaLocation=
		     http://www.springframework.org/schema/beans 
		     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		     http://www.springframework.org/schema/context
		     http://www.springframework.org/schema/context/spring-context-3.0.xsd
		     http://www.springframework.org/schema/tx
		     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
		     http://www.springframework.org/schema/aop 
		     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd>

	<context:annotation-config />
	<tx:annotation-driven transaction-manager=txManager />

	<context:component-scan
		base-package=br.com.ilog, br.com.ilog.seguranca.presentation.mbean />

	<!-- Gerenciador de transacoes baseado em JPA -->
	<bean id=txManager class=org.springframework.orm.jpa.JpaTransactionManager>
		<property name=entityManagerFactory ref=entityManagerFactory />
	</bean>
	<tx:advice id=txAdvice>
		<!-- configuracoes das transacoes -->
		<tx:attributes>
			<!-- todos os metodos que comecam com select e find sao read-only <tx:method 
				name=select* propagation=SUPPORTS read-only=true /> <tx:method name=find* 
				propagation=SUPPORTS read-only=true/> -->
			<!-- Os outros metodos possuem requerem uma transacao -->
			<tx:method name=* propagation=REQUIRED />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<!-- Todos as instancias das classes que fazem parte do pacote service, 
			independente da hierarquia, terao os metodos gerenciados -->
		<aop:pointcut id=serviceMethods expression=execution(* br.com.projeto.cadastro.business.facade.CadastroFacadeImpl.(..))/>
		<aop:advisor advice-ref=txAdvice pointcut-ref=serviceMethods />
	</aop:config>

	<!-- banco desenv -->
	<bean id=myDataSource class=com.mchange.v2.c3p0.ComboPooledDataSource
		destroy-method=close>
		<property name=driverClass value=com.microsoft.sqlserver.jdbc.SQLServerDriver />
		<property name=jdbcUrl
			value=jdbc:sqlserver://localhost:1433;databaseName=banco />
		<property name=user value=sa />
		<property name=password value=semeador />
		<property name=initialPoolSize value=20 />
		<property name=minPoolSize value=20 />
		<property name=maxPoolSize value=20 />
		<property name=idleConnectionTestPeriod value=500 />
		<property name=acquireIncrement value=1 />
		<property name=maxStatements value=1000 />
		<property name=numHelperThreads value=1 />
		<property name=maxIdleTime value=5></property>
	</bean>

	

	

	<!-- Fabrica de entity managers -->
	<bean id=entityManagerFactory
		class=org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean>
		<property name=dataSource ref=myDataSource />
		<property name=persistenceUnitName value=unit />
		<property name=jpaVendorAdapter>
			<bean class=org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
				<property name=showSql value=true />
				<property name=generateDdl value=true />
				<property name=databasePlatform value=org.hibernate.dialect.SQLServerDialect />
			</bean>
		</property>
	</bean>


	<bean id=myAspect class=br.com.projeto.geral.business.BusinessInterceptor />

	<import resource=classpath:/META-INF/myview-spring-init.xml />
	<bean id=persistentContextFactory
		class=org.apache.myfaces.orchestra.conversation.spring.JpaPersistenceContextFactory>
		<property name=entityManagerFactory ref=entityManagerFactory />
	</bean>
</beans>



Responder

Gostei + 0

25/05/2012

Wisley Souza


@Component
public class PaisRepositoryImpl extends Crud<Pais> implements
		PaisRepositorio, Serializable {

	/** */
	private static final long serialVersionUID = -2458409149862454836L;

	@PersistenceContext(unitName=unit)
	private EntityManager entityManager;


// método alterar país
	@Override
	public Pais alterar(Pais entity) throws Exception {
		Pais p = super.alterar(entity);
		getEntityManager().flush();
		return p;
	}

	// método inserir país
	@Override
	public Pais cadastrar(Pais pais) throws Exception {
		
		Pais p = super.cadastrar(pais);
		return p;
	}

Responder

Gostei + 0

25/05/2012

Davi Costa

Desculpa erapara ter te pedido o erro também..
mas uma observação eo pacote dessa classe PaisRepositoryImpl é que deveria estar no xml nesse trecho:

<aop:pointcut id=serviceMethods expression=execution(* br.com.projeto.cadastro.business.facade.CadastroFacadeImpl.(..))/>


Pois é o pacote que chama o entitymanager é que deve ser transacional

att Davi
Responder

Gostei + 0

25/05/2012

Wisley Souza

java.lang.IllegalStateException: BeanFactory not initialized or already closed - call refresh before accessing beans via the ApplicationContext

troquei a classe... mas continua no erro
Responder

Gostei + 0

25/05/2012

Davi Costa

deixa assim:
<aop:pointcut id=serviceMethods
expression=execution(* br.com.projeto.cadastro.business.facade..*.*(..)) />

Se o pacote da classe que chama o entitymanager for outro vc altera:

<aop:pointcut id=serviceMethods
expression=execution(* br.com.projeto.cadastro.business.outropacote..*.*(..)) />
Lembrando vc n passa a classe não.
e esse trecho..*.*(..)) /> é essencial inclusive com os dois pontos iniciais.

Se o seu pacote repository tem um pacote de serviços e um das implementações, tipo:

br.dao e br.dao.impl vc deixaria no caso assim:

<aop:pointcut id=serviceMethods
expression=execution(* br.dao..*.*(..)) />
Pq ai entraria nos pacotes filhos também

att Davi
Responder

Gostei + 0

25/05/2012

Wisley Souza

eu fiz isso ai e nao funcionou e deu pau...


mas olhando o persistence eu tirei essa linha dele:

<property name=hibernate.connection.release_mode value=after_statement />

e funcionou, vc sabe o impacto de tirar ela dei uma olhada na documentação, isso tem haver com dead lock?
Responder

Gostei + 0

28/05/2012

Davi Costa

Dá uma olhada na documentação:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session

interessantíssimo esse fórum, problema parecido com o seu, assim como o artigo abaixo:

http://forum.springsource.org/showthread.php?19825-connection-release-mode
http://www.roseindia.net/hibernate/hibernate4/hibernate_connection_release_mode.shtml

att Davi
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar