Pergunta

Estou tentando colocar minhas consultas nomeadas no meu Orm.xml (colocar em meta-inf com persistence.xml), mas meu orm.xml parece ser ignorado pelo Hibernate/JPA.

Quando tento criar minha consulta nomeada com em.createnamedQuery ("myquery"), ele retorna que não consegue encontrar essa consulta.

Eu uso a anotação e gostaria de externalizar minhas consultas nomeadas em Orm.xml (apenas isso).

Aqui está minha persistência.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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" version="1.0">

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <mapping-file>META-INF/orm.xml</mapping-file>

    <class>com.mysite.Account</class>

    <properties>
        <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
        <property name="hibernate.cache.use_query_cache" value="true" />
        <property name="hibernate.cache.use_second_level_cache" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="use_sql_comments" value="false" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000" />

        <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" />
    </properties>

</persistence-unit>

</persistence>

Aqui está o meu Orm.xml

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">

<package>com.mysite</package>

<entity class="Account">
    <sql-result-set-mapping name="nicknames">
        <column-result name="nickname" />
    </sql-result-set-mapping>
    <table name="Account" />
    <named-native-query name="myQuery" result-set-mapping="nicknames">
        <query><![CDATA[select a.nickname from Account a]]>
    </query>
    </named-native-query>
</entity>
</entity-mappings>

O que estou fazendo de errado? Por que meu orm.xml é ignorado?

obrigado

Foi útil?

Solução

Ok, finalmente entendi!

Eu estava salvando meu orm.xml no diretório meta-inf. Quando movo esse arquivo para o meu pacote onde tenho meu objeto de domínio (como no meu exemplo: com.mysite), o Orm.xml não é ignorado e tudo é executado.

Eu também preciso mudar o caminho no arquivo de mapeamento (persistence.xml): com/mysite/orm.xml

Outras dicas

Seu orm.xml tem um erro menor que quebra tudo. O ponto é que a sequência das declarações dos elementos deve cumprir o respectivo esquema XML (que é http://java.sun.com/xml/ns/persistence/orm_1_0.xsd em particular). Isso é fácil de verificar executando o código XML através de um validador que homenageia esquemas XML. Abaixo está a versão corrigida do seu Orm.xml que deve funcionar como um charme.

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="
                     http://java.sun.com/xml/ns/persistence/orm
                     http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">

    <package>com.mysite</package>

    <entity class="Account">
        <table name="Account" />
        <named-native-query name="myQuery" result-set-mapping="nicknames">
            <query><![CDATA[
            select a.nickname from Account a
            ]]></query>
        </named-native-query>
        <sql-result-set-mapping name="nicknames">
            <column-result name="nickname" />
        </sql-result-set-mapping>
    </entity>
</entity-mappings>

Como dito

Quando tento criar minha consulta nomeada com em.createnamedquery ("myquery"), retorna que não consegue encontrar esta consulta.

Você está certo. Mas você esquece o seguinte

Se você colocar uma definição de consulta nomeada dentro de um elemento, em vez da raiz, é prefixado com o nome da classe de entidade

Então você precisa ligar para o seu nome nomeado

 em.createNamedQuery("Account.myQuery")

Estou curioso: sua classe de conta é armazenada no root ClassPath ??? Caso contrário, você corrige o pacote ausente. Suponha que a classe de conta seja armazenada dentro de br.com.hibernate.model.Domain.Account. Então você deve declarar sua entidade como

<entity class="br.com.hibernate.model.domain.Account" instead

E você precisa ligar para o seu nome nomeado

em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead

Apenas um Adivice: quando você estiver usando o Hibernate como seu provedor de persistência, não precisa definir sua classe de entidade no arquivo persistence.xml.

Saudações,

"Meta-Inf/Orm.xml" é o arquivo de mapeamento padrão que será visto por qualquer gerente de entidade compatível com JPA.

De fato, se o seu arquivo de mapeamento for "meta-inf/orm.xml", você não precisará sequer definir isso em sua persistência.xml.

É isso que o Manual de Configuração de Hibernato diz sobre isso:

O elemento de classe especifica um arquivo de mapeamento XML compatível com EJB3 que você mapeará. O arquivo deve estar no caminho de classe. De acordo com a especificação EJB3, o Hibernate EntityManager tentará carregar o arquivo de mapeamento localizado no arquivo JAR em meta_inf/orm.xml. Obviamente, qualquer arquivo de mapeamento explícito também será carregado. De fato, você pode fornecer qualquer arquivo XML no elemento de arquivo de mapeamento, isto é. Arquivos HBM ou Descritor de implantação EJB3.

Referência: Configuração de Hibernato

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top