Tenho um arquivo persistance.xml muito simples:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
<class>pl.michalmech.eventractor.domain.User</class>
<class>pl.michalmech.eventractor.domain.Address</class>
<class>pl.michalmech.eventractor.domain.City</class>
<class>pl.michalmech.eventractor.domain.Country</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
e funciona.
Mas quando eu removo os <class>
elementos, o aplicativo não vê entidades (todas as classes são anotadas com @Entity
).
Existe algum mecanismo automático para fazer a varredura de @Entity
classes?
No ambiente Java SE, por especificação, você deve especificar todas as classes como fez:
e
(JSR-000220 6.2.1.6)
Em ambientes Java EE, você não precisa fazer isso, pois o provedor procura anotações para você.
Extraoficialmente, você pode tentar definir
<exclude-unlisted-classes>false</exclude-unlisted-classes>
em seu persistence.xml. Este parâmetro é padronizadofalse
em EE etrue
em SE. Tanto o EclipseLink quanto o Toplink suportam isso, pelo que posso dizer. Mas você não deve confiar que ele funcionará no SE, de acordo com as especificações, conforme declarado acima.Você pode TENTAR o seguinte (pode ou não funcionar em ambientes SE):
fonte
<exclude-unlisted-classes>false</exclude-unlisted-classes>
não funcionou com WildFly 8.2.1.Final + Hibernate 4.3.7Não, você não necessariamente. Aqui está como você faz isso no Eclipse (testado pelo Kepler):
Clique com o botão direito do mouse no projeto, clique em Propriedades , selecione JPA , no tique de gerenciamento de classe de Persistência, Descobrir classes anotadas automaticamente .
fonte
persistence.xml
que o Eclipse gera.Para aqueles que executam JPA no Spring, da versão 3.1 em diante, você pode definir a
packagesToScan
propriedade emLocalContainerEntityManagerFactoryBean
e se livrar de persistence.xml completamente.Aqui está o detalhe
fonte
Você pode fornecer o
jar-file
caminho do elemento para uma pasta com classes compiladas. Por exemplo, adicionei algo assim quando preparei persistence.xml para alguns testes de integração:fonte
para JPA 2+ isso resolve
escaneie todos os frascos em guerra para classes @Entity anotadas
fonte
java.lang.IllegalArgumentException: Unable to visit JAR file:
).O Hibernate não é compatível
<exclude-unlisted-classes>false</exclude-unlisted-classes>
com SE, (outro autor mencionou que isso funciona com TopLink e EclipseLink).Existem ferramentas que irão gerar automaticamente a lista de classes para persistence.xml, por exemplo, o assistente Import Database Schema no IntelliJ. Depois de obter as classes iniciais do seu projeto em persistence.xml, deve ser simples adicionar / remover classes individuais manualmente à medida que o projeto avança.
fonte
Não tenho certeza se você está fazendo algo semelhante ao que estou fazendo, mas estou gerando uma carga de fonte java de um XSD usando JAXB em um componente separado usando Maven. Vamos dizer que este artefato é chamado de "modelo base"
Eu queria importar este artefato contendo o código-fonte java e executar o hibernate em todas as classes em meu jar de artefato "modelo base" e não especificar cada uma explicitamente. Estou adicionando "modelo base" como uma dependência para meu componente de hibernação, mas o problema é que a tag em persistence.xml permite apenas que você especifique caminhos absolutos.
A forma como eu contornei isso é copiar minha dependência jar do "modelo base" explicitamente para meu diretório de destino e também remover a versão dele. Portanto, enquanto se eu construir meu artefato "modelo-base", ele gerar "modelo-base-1.0-SNAPSHOT.jar", a etapa de recursos de cópia o copia como "modelo-base.jar".
Portanto, em seu pom para o componente de hibernação:
Em seguida, chamo o plug-in de hibernação na próxima fase de "classes de processo":
e, finalmente, em meu persistence.xml, posso definir explicitamente a localização do jar assim:
e adicione a propriedade:
fonte
Não é uma solução, mas uma dica para quem usa Spring:
Tentei usar
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
com configuração,persistenceXmlLocation
mas com isso tive que fornecer os<class>
elementos (mesmo que o quepersistenceXmlLocation
acabei de apontarMETA-INF/persistence.xml
).Quando não
persistenceXmlLocation
estou usando, posso omitir esses<class>
elementos.fonte
persistenceXmlLocation
propriedade em minhasLocalContainerEntityManagerFactoryBean
configurações. Mas todas as consultas estão funcionando, mesmo se eu omitir os<class>
elementos. Está em um aplicativo Spring / Hibernate / Maven. Mas em sua dica você diz que "Quando não estiver usando persistenceXmlLocation, eu poderia omitir esses elementos <class>." mas é o contrário para mim.Não tenho certeza se esta solução está dentro das especificações, mas acho que posso compartilhar com outras pessoas.
árvore de dependência
my-entity.jar
Contém apenas classes de entidade. Não
META-INF/persistence.xml
.my-services.jar
Depende
my-entities
. Contém apenas EJBs.my-resources.jar
Depende
my-services
. Contém classes de recursos eMETA-INF/persistence.xml
.problemas
<jar-file/>
element inmy-resources
como o nome do artefato pós-corrigido da versão de uma dependência transitória?<jar-file/>
valor do elemento e o valor real da dependência transitória?solução
dependência direta (redundante?) e filtragem de recursos
Eu coloquei uma propriedade e uma dependência em
my-resources/pom.xml
.Agora
persistence.xml
prepare-se para ser filtradoPlug-in Maven Enforcer
Com a
dependencyConvergence
regra, podemos assegurar que amy-entities
versão 'é a mesma tanto direta quanto transitiva.fonte
Não necessariamente em todos os casos.
Estou usando Jboss 7.0.8 e Eclipselink 2.7.0. No meu caso, para carregar entidades sem adicionar as mesmas em persistence.xml, adicionei a seguinte propriedade de sistema no Jboss Standalone XML:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
fonte