Como faço para externalizar as consultas nomeadas em um aplicativo de anotações de hibernato?

StackOverflow https://stackoverflow.com/questions/602397

  •  03-07-2019
  •  | 
  •  

Pergunta

Existe uma maneira de externalizar as consultas HQL nomeadas para um arquivo externo. Eu tenho muitas consultas nomeadas e usando @NamedQueries e @NamedQuery No topo das minhas aulas de entidades, está sofrendo.

Existe uma maneira de externalizar para vários arquivos?

Foi útil?

Solução

Você pode colocar as perguntas em package-info.java Classe, em, digamos, pacote raiz de seus objetos de domínio. No entanto, você deve usar o próprio Hibernate @NamedQueries e @NamedQuery anotações, em vez das de javax.persistence.

Exemplo package-info.java Arquivo:

@org.hibernate.annotations.NamedQueries({
    @org.hibernate.annotations.NamedQuery(
        name = "foo.findAllUsers", 
        query="from Users") 
}) 

package com.foo.domain;

Então, você deve adicionar o pacote ao seu AnnotationConfiguration. Eu uso a primavera, então lá está uma questão de definir annonatedPackages propriedade:

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="annotatedClasses">
      <list>
      ...
      </list>
</property>
<property name="annotatedPackages">
  <list>
      <value>com.foo.domain</value>
  </list>
</property>

Você também pode colocar definições de tipo e filtro no mesmo arquivo.

Outras dicas

Não acho que isso seja possível, pois os valores de atributo/propriedade de anotação devem estar disponíveis no horário de compilação. Portanto, as strings não podem ser externalizadas para um arquivo que precisa ser lido por algum tipo de processo.

Tentei descobrir se havia algo que o pacote-info.java poderia fornecer, mas não conseguiu encontrar nada.

Uma estratégia alternativa para a organização pode estar armazenando as consultas como constantes em uma classe.

Na sua aula de entidade:

@NamedQuery(name="plane.getAll", query=NamedQueries.PLANE_GET_ALL)

Em seguida, defina uma aula para suas constantes de consulta:

public class NamedQueries {
    ...
    public static final String PLANE_GET_ALL = "select p from Plane p";
    ...
}

Talvez não seja exatamente isso que o autor pediu (para externalizar para o arquivo não Java), mas foi assim que eu resolvi:

1.) No meu arquivo XML de contexto de aplicativo, adicionei mappingResources para sessionFactory

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
      <list>
        <value>META-INF/Country.hbm.xml</value>
      </list>
    </property>
    <property name="annotatedClasses">
        <util:list>
            <value>com.example.Country</value>
        </util:list>
    </property>
    <property name="hibernateProperties" ref="hibernateProperties" />
</bean>

e naquele país.hbm.xml eu tenho

<?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_2_0.xsd"
    version="2.0">

    <entity class="com.example.Country">

        <named-query name="countryFindByCode">
            <query><![CDATA[
                select c
                  from Country c
                 where c.code = :code
            ]]></query>
        </named-query>

        <named-query name="countryFindByName">
            <query><![CDATA[
                select c
                  from Country c
                 where c.name = :name
            ]]></query>
        </named-query>

    </entity>

</entity-mappings>

Eu usei isso apenas para definir consultas nomeadas, o restante da configuração da entidade está em anotações.

Talvez isso ajude alguém.

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
      <list>
        <value>META-INF/Country.hbm.xml</value>
      </list>
    </property>
    <property name="annotatedCla 
                  from Country c
                 where c.name = :name
            ]]></query>
        </named-query>

    </entity>

</entity-mappings>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top