Problema Persistencia JSF 2+Spring 3+JPA
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:
Metodos salvar e alterar:
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
Curtidas 0
Respostas
Wisley Souza
24/05/2012
Fachada:
config spring:
@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>
GOSTEI 0
Robson Teixeira
24/05/2012
favor postar o log do erro.
GOSTEI 0
Davi Costa
24/05/2012
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
É 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
GOSTEI 0
Wisley Souza
24/05/2012
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
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call refresh before accessing beans via the ApplicationContext
GOSTEI 0
Davi Costa
24/05/2012
posta como está seu xml e sua classe que realmente chama o entitymanager
att Davi
att Davi
GOSTEI 0
Wisley Souza
24/05/2012
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>
GOSTEI 0
Wisley Souza
24/05/2012
@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;
}
GOSTEI 0
Davi Costa
24/05/2012
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
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
GOSTEI 0
Wisley Souza
24/05/2012
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call refresh before accessing beans via the ApplicationContext
troquei a classe... mas continua no erro
troquei a classe... mas continua no erro
GOSTEI 0
Davi Costa
24/05/2012
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
<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
GOSTEI 0
Wisley Souza
24/05/2012
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?
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?
GOSTEI 0
Davi Costa
24/05/2012
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
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
GOSTEI 0