Vraptor 3 duas sessions factories, parte II [resolvido]

Usando a solução do @Lavieri apresentada no topico http://guj.com.br/posts/list/141887.java
Eu estou tendo um problema.

Usando duas sessions factories ao iniciar dá esse erro

[INFO] [2009-10-26 @ 13:08:27] [main|DatabaseMetadata] table not found: empresa
2009-10-26 13:08:27.579::WARN:  failed vraptor
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoryCollectionCreator' defined in file [S:\Edufa\workspace\w\api\target\classes\br\com\w\infra\vraptor\util\SessionFactoryCollectionCreator.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.w.infra.vraptor.util.SessionFactoryCollectionCreator]: Constructor threw exception; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:883)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)

...

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.w.infra.vraptor.util.SessionFactoryCollectionCreator]: Constructor threw exception; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
	... 61 more
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
	at br.com.w.repository.impl.HibernateUtilities.createEntityManagerFactory(HibernateUtilities.java:55)
	at br.com.w.repository.impl.HibernateUtilities.getSessionFactory(HibernateUtilities.java:41)
	at br.com.w.infra.vraptor.util.SessionFactoryCollectionCreator.<init>(SessionFactoryCollectionCreator.java:16)

Realmente a tabela empresa não está na base de dados definida pelo persistence-unit default.
No caso a entidade Empresa depende do outro persistence-unit (default-w), mas dá erro ao inicializar o primeiro (default).
Fora do vraptor, ao usar apenas um session factory (usando junit) funciona e não dá esse erro.
A impressão é q tem algo a ver com o spring, mas como não conheço ele, não sei onde investigar

Componente usado:


@Component
@ApplicationScoped
public class SessionFactoryCollectionCreator implements ComponentFactory<SessionFactoryCollection> {
	private final SessionFactoryCollection factoryCollection;

	public SessionFactoryCollectionCreator() {
		this.factoryCollection = new 
			SessionFactoryCollection(
					HibernateUtilities.getSessionFactory("default"), // <-- Erro aqui
					HibernateUtilities.getSessionFactory("default-w")); // <-- persistencia de empresa definida aqui
	}

...

[]s

tenta sincronizar o método

HibernateUtilities.getSessionFactory

pode ser que uma session esteja tentando configurar coisas na outra…

coloca na assinatura do metodo “synchronized”

Olá @Lavieri
Já tinha pensando nisso, o método está como:

public static synchronized SessionFactory getSessionFactory(String persistenceUnitName) {}

Mas é bem isso o q parece que uma está interferindo na outra, ou melhor está achando q o entidade “Empresa” é persistida pela SessionFactory “default”, quando na verdade é da “default-w”. Aí obvio que não acha a tabela e dá exception na inicialização.

esse MESMO código passa no junit?, será que ele tá pegando o arquivo certo?

Não é exatamente o mesmo código, instancio apenas um SessionFactory exporto os dados para usar com DBUnit e funciona.
Vou tentar montar um exemplo menor e ver se funciona para tentar achar o problema, ou pelo menos ter mais informações.

tenta rodar no junit esse código:

 new   
             SessionFactoryCollection(  
                     HibernateUtilities.getSessionFactory("default"), // <-- Erro aqui  
                     HibernateUtilities.getSessionFactory("default-w"));

eu já sei qual é o seu problema, mas não lembro agora o nome da propriedade pra resolver…

sua unidade de persistencia esta configurada pra encontrar automaticamente as Entidades no seu código… e é ai que esta o problema…

vc precisa colocar pra não encontrar sozinho as entidades, e definir em separado a entidade de cada Unidade de Persistencia

@Lavieri sua dica q matou o problema obrigado

A propriedade é essa:
<exclude-unlisted-classes>true</exclude-unlisted-classes>

usa-se assim:

	&lt;persistence-unit name="default-wecsite" transaction-type="RESOURCE_LOCAL"&gt;
		&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
		
		&lt;class&gt;br.com.w.model.Usuario&lt;/class&gt;
		&lt;class&gt;br.com.w.model.Unidade&lt;/class&gt;
		&lt;class&gt;br.com.w.model.Empresa&lt;/class&gt;

		&lt;exclude-unlisted-classes&gt;true&lt;/exclude-unlisted-classes&gt;   
     &lt;properties&gt;
...

Agora funcionando, era um problema mais de hibernate/jpa, se alguem puder mover para o local correto :wink:
[]s

vou colocar aqui comentado no meu persistence.xml =x

sempre esqueco o nome dessa jossa…

e é sempre bom ajudar, qualquer coisa estamos por aqui, sempre leio também o forum de persistencia