Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

@Entity e declaração no persistence

Olá Pessoal, após fazer o exercício de mapeamento do JPA fiquei com a seguinte dúvida: Porque é necessário declarar a classe no persistence.xml uma vez que ela já foi anotada com @Entity? O JPA já não consegue identificar que esta é uma entidade somente pela anotação? Obrigado!

5 respostas

Danilo,

A JPA em si não consegue fazer o scan automático somente pela anotação. Todas as classes devem estar mapeadas no persistence.xml. Fazer o scan automático pela anotação é uma feature do Hibernate.

Danilo,

A chave para você entender isso é que você deve separar os conceitos de especificação e implementação. Uma especificação diz como determinada "coisa" deve se apresentar, o que deve fazer. Já uma implementação pega essa especificação e diz : eu vou fazer isso que foi especificado dessa forma. Assim, O JPA é uma especificação (no primeiro vídeo é dito isso). Essa especificação dá orientações básicas de como as coisas devem ser feitas, e nesse contexto, não pode impor tecnologias específicas ou recursos muito específicos, como mapeamentos dinâmicos, pois são relativamente difíceis de implementar. Mas um framework, que é uma implementação de uma especificação, pode incrementar um pouco as coisas, adicionando recursos omitidos ou melhorando alguma coisa, desde que não viole a especificação. Veja que se você não usar a especificação JPA, mas trabalhar diretamente com o Hibernate, importando diretamente os pacotes dele nas classe no lugar da JPA, você não terá que fazer esse mapeamento de unidades de persistência. O problema dessa abordagem é que, se mais tarde você resolver usar outro ORM, como o ObjectDB, você terá que alterar todas as suas classes de entidade, e talvez ter algum problema extra. Assim, é melhor usar a especificação, criar suas unidades de persistência e garantir que tudo irá funcionar independente do ORM utilizado.

Danilo, imaginamos que voce tenha no seu arquivo persistencia.xml duas configurações para diferentes banco de dados A e B, ou seja dois arquivos persistence-unit. Imagina que voce tenha 20 entidades no seu projeto, mas apenas 10 dela pertence ao banco de dados A, se todas as classes anotadas com o @Entity voce conhecido no arquivo persistence.xml como uma tabela no banco de dados voce teria um grande problema. 

Surge a sua duvida, como faço para mapear apenas as 10 classes especifica, eu vou ter que colocar as 10 classes dentro do persistence-unit do banco de dados A, a resposta que tenha é que sim, voce deve colocar as 10 entidades no seu persistence-unit para que ele seja reconhecida seguida dessa anotação 
<exclude-unlisted-classes>true</exclude-unlisted-classes> indicando que a aplicação só aceitará as entidades que voce definiu no seu arquivo. Uma dica que eu posso adiantar para voce para nao deixar o seu arquivo persistence.xml muito poluído com codigos dentro dele, é voce criar um arquivo xml por fora que represente essas 10 entidades, vamos chamar esse arquivo de orm_entidadeA.xml dentro dele voce pode definir as 10 entidades e chamar apenas esse arquivo orm_entidadeA.xml dentro do seu persistence-unit assim seu arquivo ficar muito mais limpo e facil de entender. Para chamar o arquivo orm_entidadeA.xml voce usa o seguinte <mapping-file>orm_entidadeA.xml</mapping-file>
Qualquer duvida posta nos comentarios;
solução!

Danilo, imaginamos que voce tenha no seu arquivo persistencia.xml duas configurações para diferentes banco de dados A e B, ou seja dois arquivos persistence-unit. Imagina que voce tenha 20 entidades no seu projeto, mas apenas 10 dela pertence ao banco de dados A, se todas as classes anotadas com o @Entity voce conhecido no arquivo persistence.xml como uma tabela no banco de dados voce teria um grande problema. Surge a sua duvida, como faço para mapear apenas as 10 classes especifica, eu vou ter que colocar as 10 classes dentro do persistence-unit do banco de dados A, a resposta que tenha é que sim, voce deve colocar as 10 entidades no seu persistence-unit para que ele seja reconhecida seguida dessa anotação

true indicando que a aplicação só aceitará as entidades que voce definiu no seu arquivo. Uma dica que eu posso adiantar para voce para nao deixar o seu arquivo persistence.xml muito poluído com codigos dentro dele, é voce criar um arquivo xml por fora que represente essas 10 entidades, vamos chamar esse arquivo de orm_entidadeA.xml dentro dele voce pode definir as 10 entidades e chamar apenas esse arquivo orm_entidadeA.xml dentro do seu persistence-unit assim seu arquivo ficar muito mais limpo e facil de entender. Para chamar o arquivo orm_entidadeA.xml voce usa o seguinte orm_entidadeA.xml Qualquer duvida posta nos comentarios;

Por algum motivo nao saiu os codigo entao vou por espaço para que apareça

continuaçao final do primeiro paragrafo < exclude-unlisted-classes>true

Para chamar o arquivo orm_entidadeA.xml voce usa o seguinte < mapping-file>orm_entidadeA.xml< /mapping-file>

Qualquer duvida posta nos comentarios;