<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Últimas mensagens do tópico "Hibernate - Vale a pena abstrair ainda mais ?"]]></title>
		<link>http://www.guj.com.br/posts/list/12.java</link>
		<description><![CDATA[Últimas mensagens enviadas no tópico "Hibernate - Vale a pena abstrair ainda mais ?"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Estudando sobre Domain Driven Design aprendi sobre Repository, Criteria, etc. Juntamente com os Data Mappers (Famosos DAOs em Java) catalogados por Fowler, percebi que o Hibernate/JPA aparentemente utilizou-se dessa ideia para a criação do seu framework. <br /> <br /> Concluí então, que utilizando Hibernate não preciso criar RepositorioXXX ou Criterias ou DAOs já que o Hibernate tem tudo isso a disposição através da Session/EntityManager, Criteria, Dialeto do Banco de Dados e a geração automática das instruções SQL.<br /> <br /> Eu sei que a Session/EntityManager é muito genérico, serve como repositório de todos os objetos, diferente de um RepositorioCliente por exemplo, mas mesmo assim, ainda vou precisar em algum cenário criar classes para o padrão Repository quando utilizo Hibernate ?<br /> <br /> Utilizando a Session/EntityManager na Fachada de Serviços ou até mesmo dentro de alguma Entity(DDD) em alguma operação de negócio que precise de dados, ao meu ver estou utilizando implicitamente todos esses padrões e implementando da maneira correta.<br /> <br /> Sugestões ?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392124/hibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392124/hibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:02:27]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Eu tenho usado Repositorys diretamente de dentro das Entitys, e dentro do Repository uso diretamente o Hibernate, sem mais abstrações.<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392131/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392131/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:10:25]]> GMT</pubDate>
				<author><![CDATA[ xandroalmeida]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Pois é. Mas é isso que eu acho não fazer sentido. <br /> <br /> Por exemplo:<br /> [code]<br /> public class RepositorioUsuario {<br />    private EntityManager em;<br />    public void salvar(Usuario u) {<br />       em.persist(u);<br />    }<br /> }<br /> [/code]<br /> O que eu ganhei com isso ? [b]Nada[/b].<br /> <br /> Virou um delegador apenas.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392144/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392144/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:26:49]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Neste caso da a impressão mesmo de apenas uma camada a mais, agora vc já parou para pensar em casos mais complexos?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392150/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392150/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:33:27]]> GMT</pubDate>
				<author><![CDATA[ ovelha]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Eu uso o repository só para buscas... para persistir e para mergear uso o EntityManager... pra mim o EM, já é uma abstração... ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392151/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392151/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:34:41]]> GMT</pubDate>
				<author><![CDATA[ rodrigoy]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Por isso eu tenho um AbstractRepository&lt;T&gt; com as principais funções de CRUD. Ai se não preciso nada além do CRUD, basta extenter e não fazer mais nada.<br /> <br /> o problema de você não ter repository é correr o risco de duplicar código. Por exemplo, você em várias partes do sistema tem que obter o usuário à partir do email. Se você não tem um Repository de Usuários, terá que construir consultas para buscar o usuário pelo email por varias partes do sistema.<br /> <br /> <br /> <br />   <br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392157/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392157/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:39:33]]> GMT</pubDate>
				<author><![CDATA[ xandroalmeida]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Utiliza Spring com HibernateDaoSuport vai ficar bem mais facil de trabalhar com Hibernate, ai ele controla Session/Entity Manager para vc!]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392159/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392159/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:40:14]]> GMT</pubDate>
				<author><![CDATA[ ronybrand]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=rodrigoy]Eu uso o repository só para buscas... para persistir e para mergear uso o EntityManager... pra mim o EM, já é uma abstração... [/quote]<br /> <br /> Os Repositorys acabam sendo usados para buscas mesmo, acho que é esta a idéia.<br /> <br /> Como eu disse, eu prefiro ter um AbstractRepository&lt;T&gt; com os métodos de CRUDs básicos, para evistar o uso do EM diretamente, mas também não vejo problemas nisso.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392162/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392162/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 15:44:40]]> GMT</pubDate>
				<author><![CDATA[ xandroalmeida]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=rodrigoy]Eu uso o repository só para buscas... para persistir e para mergear uso o EntityManager... pra mim o EM, já é uma abstração... [/quote]<br /> Até entendi mas ai você ficaria com repositórios incompletos e/ou dupicados. Ex: RepositorioConta só para pesquisa nas contas e o EntityManager para o crud. Não ficaria confuso essas classes no seu Domain Model ? Teoricamente caso eu queira utilizar o seu RepositorioConta eu vou procurar uma opção de salvar minha conta ali, entende ?<br /> <br /> Acho que ainda não ta legal ....]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392180/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392180/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 16:03:05]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Você acha que o EntityManager é uma classe do Domain Model ou da Infra?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392210/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392210/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 16:46:02]]> GMT</pubDate>
				<author><![CDATA[ rodrigoy]]></author>
			</item>
			<item>
				<title>Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ O Repository faz além de buscas com de filtros sql.<br /> <br /> Do tipo.<br /> <br /> Busque todas as casas com 3 quartos onde o primeiro quarto tenha a cor rosa e a cozinha tenha uma janela para um bosque com uma macieira e um cavalo branco (apenas um cavalo) <img src="http://www.guj.com.br/images/smilies/283a16da79f3aa23fe1025c96295f04f.gif" border="0"> .<br /> <br /> Uma busca dessas certamente não vai poder ser feita apenas com joins e filtros no where....<br /> <br /> Aí que o repository entra efetivamente.<br /> <br /> Entende ??<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392213/hibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392213/hibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 16:52:53]]> GMT</pubDate>
				<author><![CDATA[ nbluis]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ @rodrigoy<br /> Você tocou no ponto. Tecnicamente EntityManager seria um Repository so que genérico. Porém, a implementação que o Hibernate/JPA fez fica com cara de infra. Então fica parecendo uma mistura das duas coisas, ou seja, responsabilidade demais. O cheiro de infra é tão grande por causa dos métodos persist(), merge(), ao invés de um adicionar() por exemplo. <br /> <br /> Mas de qualquer maneira ainda acho meio esquisito você ter um Repository que não tem as opções adicionar() e remover() por exemplo, ficando somente com consultas. Ta certo que poderia ter delegando para o EntityManger fazer isso mais sei lá, parece uma coisia meio bacalhau entende ? O que você acha ?<br /> <br /> @nbluis <br /> Isso foi falado anteriormente pelo rodrigoy, porém o problema é justamente este. Um Repository segundo a definição é onde a Entity fica guardada então fica estranho eu ter um RepositoryConta para buscar uma conta e depois quando eu for adicionar uma nova conta eu não poder usar esse Repository. Deveria se único para esse Entity.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392240/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392240/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 17:26:25]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Como assim não pode chamar o repository?<br /> <br /> Vc chama o repository para adicionar, remover ou qualquer coisa dessas.<br /> <br /> Já parou para pensar no fato de que nem todas as suas entidade podem ter o adicionar(persist) ?<br /> O Repository é quem controla isso.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392252/hibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392252/hibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 17:39:58]]> GMT</pubDate>
				<author><![CDATA[ nbluis]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Para as consultas você pode utilizar Restrictions, tanto como filtro, como ordenação!]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392272/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392272/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 18:06:53]]> GMT</pubDate>
				<author><![CDATA[ faelcavalcanti]]></author>
			</item>
			<item>
				<title>Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=nbluis]Como assim não pode chamar o repository?[/quote]<br /> Não quis dizer que não pode, só quis dizer que vai ser apenas uma delegação, ou seja, um método quase burro.<br /> [quote=nbluis]Já parou para pensar no fato de que nem todas as suas entidade podem ter o adicionar(persist) ?[/quote]<br /> Correto. O que acontece é que o EntitManager me dá todas essas operações e esse Repository sugerido como ficaria sendo que o Hibernate já tem a sua API Criteria ? Teoricamente Quando implementamos um Repositpry temos Criteria também. Não já é isso que o Hibernate faz ?<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392298/hibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392298/hibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 19:01:50]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=emerleite]<br /> <br /> Concluí então, que utilizando Hibernate não preciso criar RepositorioXXX ou Criterias ou DAOs já que o Hibernate tem tudo isso a disposição através da Session/EntityManager, Criteria, Dialeto do Banco de Dados e a geração automática das instruções SQL.<br /> <br /> [/quote]<br /> <br /> Acho que não. Os DAOs ainda são válidos, já os Repositorios nem tanto...<br /> <br /> [quote=emerleite]<br /> <br /> Utilizando a Session/EntityManager na Fachada de Serviços ou até mesmo dentro de alguma Entity(DDD) ...<br /> <br /> [/quote]<br /> <br /> Fica meio estranho acessar o EntityManger de dentro de Entities.<br /> <br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392348/hibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392348/hibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 22:15:49]]> GMT</pubDate>
				<author><![CDATA[ andre_salvati]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ O seu repositório pode cuidar de operações mais complexas do que simplesmente fazer um CRUD ou uma busca simples. Para formar um agregado, por exemplo, você pode realizar mais de uma consulta no banco. <br /> <br /> Um repositório é um elemento ativo no negócio e na modelagem, não é uma ferramenta de acesso a dados. Ele pode ser modelado com comportamento (métodos) que fazem sentido quando colocados em um diagrama do domínio, pois o objeto em sí pertence ao domínio. Um EntityManager não pertence a domínio algum, e seus métodos não são Ubiquitous.<br /> <br /> O repositório tbm é um bom lugar para você definir seus contratos quando se interage com algo da persistencia (e retornar uma exception para seu cliente da camada). Isso parece melhor do que retornar true/false, null, 1/0, e outras bizarrices.<br /> <br /> Colocar EntityManager diretamente nas entidades parece um grande acoplamento entre meios de persistencia e objetos de negócio.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392358/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392358/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Fri, 16 Nov 2007 22:46:22]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ @Lezinho<br /> Concordo com você. Então o que eu disse sobre ter no Repository um adicionar que chama o persist() do EntityManager tornando esses métodos do Repository apenas um método que delega a tarefa e era isso que não estava me agradando muito. Mas parece que não tem outro jeito.<br /> <br /> Mas de qualquer maneira a idéia do EntityManager não seria implementar um Repository só que genérico ? Eu entendo que fica mais Ubiquitous mas não sei se vale muito a pena abstrair isso em todos os casos. Talvez na maioria dos casos não seja necessário. E isso justamente que eu to me perguntando se tem algum caso que vou precisar realmente ...<br /> <br /> Exemplos ?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392475/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392475/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Sat, 17 Nov 2007 14:05:38]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Parta do pressuposto que é natural da entidade ela ser "persistente", dessa forma, não é comum que uma entidade "salve" ela própria ou outras entidades dentro do comportamento da própria entidade. Minhas entidades não dependem do EntityManager, mas minhas façades sim... <br /> <br /> Dado o paradigma atual uma das grandes responsabilidades da camada de aplicação é concentrar o controle de transação, seja por AOP, Anotações, Contâiner, etc... Assim sendo, é na camada de aplicação que está os manager.persist e manager.merge.<br /> <br /> Lembre-se também: só usamos o EntityManager por causa de ORM, e nossas entidades não sabem disso.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392625/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392625/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Sun, 18 Nov 2007 03:11:54]]> GMT</pubDate>
				<author><![CDATA[ rodrigoy]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Concordo um pouco com o que o Rodrigo disse. Os repositorios trazem bastante valor para agregados e pesquisas complexas. Considerando que você não está usando ActiveRecord, você não vai precisar chamar save/persist/merge dentro dos seus objetos de domínio. Aí o Repositório não precisaria ter o adicionar() que só delega.<br /> <br /> Minha opinião pessoal é de que não é tão ruim ter métodos do Repositório que apenas delegam se você não quiser expor a Session/EntityManager. O Repositório nesses casos fica sendo um "Adapter", mas concordo que isso é um pouco burocrático...<br /> <br /> De qq forma, [b]Java é burocrático mesmo[/b]!  <img src="http://www.guj.com.br/images/smilies/908627bbe5e9f6a080977db8c365caff.gif" border="0"> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392647/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392647/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Sun, 18 Nov 2007 13:00:46]]> GMT</pubDate>
				<author><![CDATA[ Fabio Kung]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=rodrigoy]Parta do pressuposto que é natural da entidade ela ser "persistente", dessa forma, não é comum que uma entidade "salve" ela própria ou outras entidades dentro do comportamento da própria entidade. Minhas entidades não dependem do EntityManager, mas minhas façades sim...[/quote]<br /> Exatamente isso que eu disse nos posts anteriores. Porém pensando no Repository, em alguns casos temos referência dentro da Entity para um repositório, vide esse exemplo [url]http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/[/url]. <br /> <br /> E ai é que eu estava me perguntando se ao invés do Repository poderia ser sempre o EntityManager substituindo-o por completo. Pelo visto o pessoal ta preferindo e indicando encapsular.<br /> <br /> [quote=Fabio Kung]Minha opinião pessoal é de que não é tão ruim ter métodos do Repositório que apenas delegam se você não quiser expor a Session/EntityManager. O Repositório nesses casos fica sendo um "Adapter", mas concordo que isso é um pouco burocrático... [/quote]<br /> É o que eu havia dito que eu não gostaria já que na verdade não está me parecendo muito um adapter e tão apenas um delegate bem simples.<br /> <br /> Bem, no próximo projeto vou encapsular o EntityManager em cada Repository específico para gerênciar os agreggates e as queries complexas pra ver se terei algum ganho com isso. Claro que um ganho que percebo de cara é ficar mais Ubiquitous mas realmente como o Fábio falou, que burocracia heim ....]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392653/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392653/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Sun, 18 Nov 2007 13:30:32]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Essa discussão já foi feita no GUJ algumas vezes mas acho que 99% das suas dúvidas práticas vão se reslver se você modelar o Repositório como uma interface implementada pelo DAO. O Repositório é um conceito de negócios que desta forma vai ser implementado pelo Dependency Inversion Principle (DIP, Uncle Bob).]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392718/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392718/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Sun, 18 Nov 2007 19:06:37]]> GMT</pubDate>
				<author><![CDATA[ pcalcado]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=emerleite]Exemplos ?[/quote]<br /> <br /> Um exemplo mais simples e direto de como pode comprometer seu objeto Entity de negócio inserindo diretamente EntityManager, é na construção de testes unitários.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392734/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392734/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Sun, 18 Nov 2007 23:07:55]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=pcalcado]Essa discussão já foi feita no GUJ algumas vezes mas acho que 99% das suas dúvidas práticas vão se reslver se você modelar o Repositório como uma interface implementada pelo DAO. O Repositório é um conceito de negócios que desta forma vai ser implementado pelo Dependency Inversion Principle (DIP, Uncle Bob).[/quote]<br /> <br /> Tanto que nem chamo meus repositories de ContaRepository, chamo eles de ContaDAO mesmo. O que interessa é o conceito.<br /> <br /> Um padrão comum nas minhas aplicações é este:<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392748/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392748/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 01:35:13]]> GMT</pubDate>
				<author><![CDATA[ rodrigoy]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ O que não impediria também de fazer isso:]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392749/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392749/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 01:41:05]]> GMT</pubDate>
				<author><![CDATA[ rodrigoy]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=rodrigoy]<br /> <br /> Tanto que nem chamo meus repositories de ContaRepository, chamo eles de ContaDAO mesmo. O que interessa é o conceito.<br /> <br /> [/quote]<br /> <br /> Mas será que nome não faz parte do conceito ?<br /> <br /> Neste caso ContaDAO (Interface) vai estar nas classes de Dominio ?<br /> <br /> No meu modo de ver se ContaDao ser chamada de ContaRepository e esta ser injetada do Dominio, fica mais organizado.<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392767/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392767/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 08:34:05]]> GMT</pubDate>
				<author><![CDATA[ mauro_schneider]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=pcalcado]Essa discussão já foi feita no GUJ algumas vezes mas acho que 99% das suas dúvidas práticas vão se reslver se você modelar o Repositório como uma interface implementada pelo DAO. O Repositório é um conceito de negócios que desta forma vai ser implementado pelo Dependency Inversion Principle (DIP, Uncle Bob).[/quote]<br /> Pois é. Pra mim o Repository seria uma interface e não uma classe concreta. Mas o pessoal tava sugerindo como se fosse uma classe concreta. Acho que esse teu exemplo do Repository ser a especificação (contrato/interface, ou como queira) do DAO uma abordagem válida. Mas lembra da tal discussão que teve uma vez no GUJ sobre o Hibernate eliminar a necessidade do DAO, já que o EntityManager/Session faz esse papel de DAO para quase todos os cenários? Mas pelo visto não morre a necessidade que é o que eu achava que ia acontecer ... <br /> <br /> A unica coisa que mudou é que minha interface do componente de acesso a dados ficou Ubiquitous e ao invés de escrever os SQL eu uso o Hibernate (Claro, com todas as suas vantagens de lazy-load etc etc etc.)<br /> <br /> Acho que viajei na maionese achando que essa estrutura iria mudar .. Me corrijam se eu estiver errado.<br /> [quote=rodrigoy]Tanto que nem chamo meus repositories de ContaRepository, chamo eles de ContaDAO mesmo. O que interessa é o conceito. [/quote]<br /> Não estariamos deixando de expressar um conceito no código ? Acho que seria melhor que seja ContaRepository mesmo.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392777/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392777/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 09:19:17]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=Lezinho][quote=emerleite]Exemplos ?[/quote]<br /> <br /> Um exemplo mais simples e direto de como pode comprometer seu objeto Entity de negócio inserindo diretamente EntityManager, é na construção de testes unitários.<br /> [/quote]<br /> Considerando que EntityManager é uma interface, não vi diferença em coloca-lo no lugar do Repositório para a questão dos testes já que seria possível criar um mock da mesma forma. Não entendi muito bem o seu exemplo.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392782/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392782/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 09:26:10]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Ubiquitous. O que isso quer dizer mesmo?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392790/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392790/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 09:36:19]]> GMT</pubDate>
				<author><![CDATA[ BiraBoy]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=mauro_schneider]Mas será que nome não faz parte do conceito ?[/quote]<br /> <a class="snap_shots" href="http://www.fabiokung.com/2007/11/12/comments-to-gavin-king-about-ddd-and-repositories/" target="_blank" rel="nofollow">http://www.fabiokung.com/2007/11/12/comments-to-gavin-king-about-ddd-and-repositories/</a><br /> <br /> ps.: odeio fazer isso, mas essa não consegui evitar...<br /> <br /> [quote=mauro_schneider]No meu modo de ver se ContaDao ser chamada de ContaRepository e esta ser injetada do Dominio, fica mais organizado.[/quote]<br /> Concordo.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392795/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392795/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 09:46:26]]> GMT</pubDate>
				<author><![CDATA[ Fabio Kung]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Ubiquitous language é uma linguagem que todos entendem. No contexto de Domain Driven Design é uma linguagem que a equipe de desenvolvimento e o cliente entendem.<br /> <br /> Ex: Se você fala com o cliente do projeto sobre DAO, EntityManager, EJB, JDBC ele vai boiar. Já se voce Fala sobre um RepositorioDeUsuarios ou RepositorioUsuario (prefiro assim), ele pode entender que em algum momento o usuário é armazenado/removido/recuperado por ali.<br /> <br /> Baixa o livro gratuito Domain Driven Design quikly disponível no InfoQ e no capítulo 2 fala sobre o assunto com mais profundidade. [url]http://www.infoq.com/minibooks/domain-driven-design-quickly[/url]]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392798/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392798/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 09:54:22]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Fábio... olha, nomes são importantes, mas na minha opinião conceitos são mais importantes. Certo? Eu uso o nome DAO só por ser menos verboso. Teve um projeto que usei ContaREP, mas ficou estranho!<br /> <br /> Também vejo que a sua opção acoplou conceitos. Creio que a separação de conceitos entre Entidade e Repositories é bem clara. No seu modelo praticamente estamos usando Client para obter Orders. Provavelmente você terá uma interação entre objetos que essa situação ocorre, mas pode ocorrer de você precisar essa mesma busca em outros pontos do sistema. Uma das idéias do repository é poder reaproveitar essas buscas.<br /> <br /> Outro ponto: seu modelo nos diz que eu preciso ter uma instância de Client para obter as Orders. Não sei se dá pra concordar com você nesse ponto de "ser mais OO". Pode ter aumentado a coesão, mas lembre-se que com isso o acoplamento aumenta também. Eu injeto services e repositories nas minhas entidades para cumprir objetivos de negócio da entidade, não para fazer a entidade ponto de entrada para buscas...<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392815/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392815/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 10:09:39]]> GMT</pubDate>
				<author><![CDATA[ rodrigoy]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Opa Rodrigo, vamos com calma...<br /> [quote=rodrigoy]Fábio... olha, nomes são importantes, mas na minha opinião conceitos são mais importantes. Certo? Eu uso o nome DAO só por ser menos verboso. Teve um projeto que usei ContaREP, mas ficou estranho![/quote]<br /> Eu acho que nomes caminham juntos com conceitos. Usar nomes não adequados pode confundir os conceitos empregados, mas isso não é necessariamente o seu caso. Na verdade eu não sei muito bem onde termina o senso comum e começa o gosto pessoal nesse caso.<br /> <br /> [quote=rodrigoy]Também vejo que a sua opção acoplou conceitos. Creio que a separação de conceitos entre Entidade e Repositories é bem clara. No seu modelo praticamente estamos usando Client para obter Orders. Provavelmente você terá uma interação entre objetos que essa situação ocorre, mas pode ocorrer de você precisar essa mesma busca em outros pontos do sistema. Uma das idéias do repository é poder reaproveitar essas buscas.<br /> <br /> Outro ponto: seu modelo nos diz que eu preciso ter uma instância de Client para obter as Orders. Não sei se dá pra concordar com você nesse ponto de "ser mais OO". Pode ter aumentado a coesão, mas lembre-se que com isso o acoplamento aumenta também. Eu injeto services e repositories nas minhas entidades para cumprir objetivos de negócio da entidade, não para fazer a entidade ponto de entrada para buscas...[/quote]<br /> Eu até entendi o seu ponto aqui, e concordo um pouco com ele, mas não era o meu caso. No exemplo que eu dei, [b]dado um cliente[/b] eu quero as suas compras obedecendo algum critério. Poderíamos discutir se o cliente é responsável ou não por me dizer quais foram as suas compras, mas supondo que ele saiba disso (e tenha essa responsabilidade), acho razoável pedir a um cliente que me dê as suas compras. Eu não sei se ficou claro, mas como o meu requisito parte de "[b]dado um cliente...[/b]", não haverá pontos no sistema onde essa "busca" não parta de um cliente.<br /> <br /> Eu estou longe de sugerir que o cliente seja o ponto de entrada para qualquer compra e que todas as compras devem vir de clientes. Não tenho nada contra o repositório ser usado dentro ou fora de uma entidade.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392836/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392836/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 10:27:30]]> GMT</pubDate>
				<author><![CDATA[ Fabio Kung]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Uma coisa que esqueci de perguntar anteriormente foi: Se os conceitos do EntityManager são apenas de persistência e ficarão encapsulados no DAO, como fica o Criteria nessa história? <br /> <br /> Hibernate já tem uma API critéria e Domain Driven Design recomenta os Repositórios utilizando Criterias para as pesquisas. <br /> <br /> Soluções:<br /> <br /> 1 - Deixariamos a API Criteria do Hibernate vazar entre as camadas? Não me cheira muito bem isso.[/list] <br /> 2 - Criamos outro Criteria para o Repositório e converteriamos esse Criteria no Criteria do Hibernate adicionando a função de adapter a este Repositório ?<br /> 3 - ????<br /> <br /> Essas são as razões que me fazem pensar que o Hibernate/JPA (principalmente esta spec) foi criado(a) como uma solução contemplando esses conceitos que vão do Repositorio pra baixo. Como falei no post inicial, EntityManager (O Gerênciador de Entidades  <img src="http://www.guj.com.br/images/smilies/283a16da79f3aa23fe1025c96295f04f.gif" border="0"> ) é justamente o que é um Repositório se propoe (Tá certo o nome ta diferente). A parte do Critéria tem até o mesmo nome e a funcionalidade do DAO/Data Mapper está implementada internamente com a geração das queries, dialetos do  banco, etc. <br /> <br /> O fato é que por ser um EntityManager genérico com métodos que cheiram persistência, ferra com tudo e IMO acabamos tendo que fazer um bacalhau enorme para encapsular isso tudo e ficar com mais cara de conceitos de negócio e isso que ta me incomodando  <img src="http://www.guj.com.br/images/smilies/385970365b8ed7503b4294502a458efa.gif" border="0"> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392842/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392842/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 10:32:36]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Bom, no geral (sempre há exceções) eu não acho isso saudável:<br /> [code]<br /> class Repository {<br />   List busca(Criterio criterio);<br /> }<br /> [/code]<br /> Isso transfere muita responsabilidade aos utilizadores do repositório, além de espalhar esse conceito de "busca" por todos os cantos. Eu prefiro uma interface mais bem definida:<br /> [code]<br /> class Repository {<br />   List&lt;Client&gt; getSuspendedClients();<br />   List&lt;Client&gt; getOldClients();<br />   // ...<br /> }<br /> [/code]<br /> Na implementação do repositorio você usa criterias e specifications.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392864/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392864/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 10:53:06]]> GMT</pubDate>
				<author><![CDATA[ Fabio Kung]]></author>
			</item>
			<item>
				<title>Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Fabio Kung ++]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392866/hibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392866/hibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 10:55:10]]> GMT</pubDate>
				<author><![CDATA[ nbluis]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ É dessa forma que se implementa hoje até mesmo no DAO. Acho que é a melhor mesmo]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392884/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392884/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 11:19:44]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=emerleite][quote=Lezinho][quote=emerleite]Exemplos ?[/quote]<br /> <br /> Um exemplo mais simples e direto de como pode comprometer seu objeto Entity de negócio inserindo diretamente EntityManager, é na construção de testes unitários.<br /> [/quote]<br /> Considerando que EntityManager é uma interface, não vi diferença em coloca-lo no lugar do Repositório para a questão dos testes já que seria possível criar um mock da mesma forma. Não entendi muito bem o seu exemplo.[/quote]<br /> <br /> Com o EntityManager injetado (mock ou não), você teria na mesma lógica espalhado no seu código possíveis ejbqls/HibernateCriterias/Specifications/nativeSQLs ou no melhor dos casos invocações de NamedQueries... tudo junto com o resto de sua lógica.<br /> <br /> Ao realizar os unitTests você vai querer testar apenas o pertinente ao método, ou seja, toda a parafernália da persistência vai estar lá no seu design porém ignorada por uso de Mocks.<br /> <br /> Isso tudo funciona, mas a fluência do código vai ficar péssima... TDD nisso vai dar dor de cabeça.<br /> <br /> <br /> O ganho de uma abstração maior, englobando todos os aspectos da persistencia, é evidente.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/392932/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/392932/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 12:09:10]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ [quote=Lezinho]O ganho de uma abstração maior, englobando todos os aspectos da persistencia, é evidente.[/quote]<br /> Ótimo ponto Lezinho. Imagina ficar mockando EntityManager: [i]se receber query "SELECT * FROM Client ..." retorne "new List&lt;Client&gt;() ...;"[/i]. Que inferno.<br /> <br /> Isolar tudo isso em repositórios deixa tudo bem mais testável. E TDD é exatamente sobre isso; melhorar continuamente o seu design.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/393012/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/393012/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 13:49:54]]> GMT</pubDate>
				<author><![CDATA[ Fabio Kung]]></author>
			</item>
			<item>
				<title>Re:Hibernate - Vale a pena abstrair ainda mais ?</title>
				<description><![CDATA[ Ok. Me rendo rs rs rs. Vai valer a pena encapsular a utilização do EntityManager no Repositório.  <img src="http://www.guj.com.br/images/smilies/283a16da79f3aa23fe1025c96295f04f.gif" border="0"> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/74599/393067/rehibernate---vale-a-pena-abstrair-ainda-mais-
</guid>
				<link>http://www.guj.com.br/prepost/74599/393067/rehibernate---vale-a-pena-abstrair-ainda-mais-
</link>
				<pubDate><![CDATA[Mon, 19 Nov 2007 14:35:49]]> GMT</pubDate>
				<author><![CDATA[ Emerson Macedo]]></author>
			</item>
	</channel>
</rss>
