bom dia!
To desenvolvendo uma aplicação de acervo com emprestimo e tal
Utilizando Postgre + Hibernate + Java…
so que percebi que to comecando a utilizar mtas queries dentro do app, e isso pra futuras manutenções ficará complicado de se alterar…
bom
eu gostaria de saber se tem algum modo de colocar essas queries em um arquivo txt, da mesma forma queé utilizado o @NamedQuery dentro das entidades…
achei um tutorial contendo apenas para o PreparedStatment e para o ResultSet, ou seria melhor eu criar uma classe Static contendo essas QUeries?
nao vou colocar nas proprias entidades pq fiz engenharia reversa, e caso tenha alguma alteracao no BD terei de fazer a nova engenharia reversa, apagando assim as antigas @NamedQuery
se alguem tiver uma dica referente a isso, Agradeço!
@NamedQuery em arquivo separado
5 Respostas
No meu ponto de vista o uso das @NamedQueries tem o mesmo efeito na mantenibilidade do código que a criação do famosos DAOs. Separar queries em um outro arquivo não seria uma grande vantagem sendo que, provavelmente, uma mudanção em uma query virá acompanhada também de uma mudança na lógica à ela associada o que implica em um novo build no projeto, ou seja, o esforço no final seria o mesmo. Típicamente a separação de queries em um arquivo externo tem como objetivo centralizar essas queries para facilitar a localição dessas queries quando elas precisam ser modificadas e para separa-las da lógica de negócios. Esse resultado também pode ser obtido com DAOs ou @NamedQueries.
PS.: não há como definir @NamedQueries em outro lugar que não uma entidade.
Há sim. Com hibernate ao menos…
Você pode usar um arquivo de mapeamento do hibernate (hbm.xml) e adicioná-lo ao seu hibernate.cfg.xml.
Exemplo:
hibernate.cfg.xml
...
<hibernate-configuration>
<session-factory>
...
<mapping resource="queries/NamedQueries.hbm.xml"/>
...
</session-factory>
</hibernate-configuration>
NamedQueries.hbm.xml (note que declarei ela dentro de uma pasta “queries” no hibernate.cfg.xml… portanto, o xml deve estar dentro de uma pasta queries na raiz do classpath)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<query name="minhaNamedQuery">
<![CDATA[
select e
from Entidade e
]]>
</query>
</hibernate-mapping>
Assim, usando um getNamedQuery(“minhaNamedQuery”) na session do Hibernate você recupera a Named Query.
Deste modo, você pode colocar suas NamedQueries fora da entidade, deixando-a mais limpa (minha opinião: anotações sujam muito a entidade, principalmente quando há queries enormes declaradas…).
Att.,
Vou fazer mihas queries!
outra duvida
Ha como colocar essas queries no Hibernate.properties,
nao to usando xml e sim properties - (nada que eu nao possa adicionar)
ai coloco assim?
... = new AnnotationConfiguration().configure()...
Obrigado pela resposta
Na verdade o mesmo pode ser feito em JPA quando se está utilizando mapear as entidades através de arquivos xml, uma prática não muito popular já não oferece muitas vantagens e ainda é muito mais trabalhosa que o mapeamento por anotações. O problema é que escrever um arquivo xml com um monte de queries não vai solucionar nenhum problema e ainda vai dar mais trabalho.
Meu mapeamento eh em Annotations,
tenho muitas tabelas, sao 73, e algumas exigem SQL especial, com Inner Joins e etc
so que nao vou colocar nas Entidades, pois caso eu tenha que fazer a alteracao vou ter que recarregar todas as entidades, apagando assim as NamedQueries que eu ja havia escrito…
Quero utilizar o Hibernate Properties pra colocar os Dados na Conexao e XML para colocar as QUeries mais “Complexas”, e no Hibernate Util, quando eu crio as AnnotationsConfigurations, adiciono as tabelas uma a uma com o addAnnotadedClass()…
Entenderam?