Mostrando postagens com marcador JPA. Mostrar todas as postagens
Mostrando postagens com marcador JPA. Mostrar todas as postagens

quarta-feira, 12 de novembro de 2014

Princípios de bons Relacionamentos


-O primeiro princípio necessário para a correta utilização dos relacionamentos é: 
Todo relacionamento tem que ter um lado dominante. 
O que quer dizer lado dominante? Qual tabela do banco de dados terá a chave estrangeira. É possível definir o nome da chave estrangeira através da anotação @JoinColum
como no código:

@OneToOne
@JoinColumn(name = "id_nome_chave")

A anotação tem o atributo name para indicar qual deve ser o nome da chave localizada na tabela.


-O segundo princípio a se entender sobre relacionamentos é: 
Pode existir relacionamento Unidirecional ou Bidirecional. 
Um relacionamento unidirecional é o relacionamento em que apenas uma entity conhece a outra; 
E o Bidirecional ambas se conhecem, porém é necessário informar qual é o lado dominante, adicionando o atributo mappedBy no relacionamento que não for dominante.

segunda-feira, 22 de setembro de 2014

CascadeType.

O CascadeType é uma maneira de definir a forma como serão propagadas as operações em cascata de uma Entity para suas referencias. A vantagem do Cascade é a propagação automaticamente da ação configurada nos relacionamentos da entidade.
As definições do Cascade são passadas dentro das anotações @OneToOne, @OneToMany e @ManyToMany, e as possibilidades de valores para o Cascade podem ser encontradas dentro de um enum javax.persistence.CascadeType.

Tipos:
  • CascadeType.PERSIST– disparado toda vez que uma nova entity for inserida no banco de dados pelo comando entityManager.persist();
  • CascadeType.DETACH – disparado toda vez que uma entity é retirada do Persistence Context. Comandos que podem disparar essa ação: entityManager.detach(), entityManager.clear(). Ocorrerá um detach também quando o Persistence Context deixar de existir;
  • CascadeType.MERGE – disparado toda vez que uma alteração é executada em uma entity. Essa alteração pode acontecer ao final de uma transação com a qual uma managed Entity foi alterada (4.2), ou pelo comando entityManager.merge();
  • CascadeType.REFRESH – disparada quando uma entity for atualizada com informações no banco de dados. Comando: entityManager.refresh();
  • CascadeType.REMOVE – disparado quando uma entity é removida (apagada) do banco de dados, os relacionamentos marcados também serão eliminados O comando utilizado é o entityManager.remove();
  • CascadeType.ALL – todos os eventos anteriores serão sempre refletidos nas Entities relacionadas.


Exemplo para setar apenas um tipo de Cascade:

@OneToMany(cascade = CascadeType.ALL)
private List
usuarios;

Exemplo para setar um ou mais tipos, (porém não todos):

@OneToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
private List usuarios;



Observações sobre o Cascade:

  • É preciso ter bastante cuidado ao anotar um relacionamento com CascadeType.ALL. Uma vez que se a entidade fosse removida o seu relacionamento também seria removido do banco de dados.
  • CascadeType.ALL (ou opções únicas) pode causar lentidão em todas as ações realizadas na entidade. Caso a entidade tenha muitas listas um merge() poderia causar todas as listas a receberem merge().

sábado, 20 de setembro de 2014

O que é JPQL?

Consultas são tão importantes quanto armazenamentos de dados, por esse motivo é que é importante ter uma maneira flexível de acessar dados. Ai é que entramos no assunto JPQL. A JPQL é uma linguagem de consulta ORM que opera sobre classes e objetos, diferente do SQL que opera sobre tabelas. Ela é também uma especificação da JPA, e apesar de trabalhar com entidade (classes) é uma linguagem bem semelhante a SQL. Uma das vantagens da JPQL é que a mesma consulta pode ser executada em todos os bancos de dados.

O que é JPA?



O JPA nada mais é do que um conjunto de especificações (muitos textos, normas e interfaces do Java) de como uma implementação deve se comportar. Existem diversas implementações no mercado que seguem as especificações do JPA. Podemos citar o Hibernate, OpenJPA, EclipseLink e o “recente” Batoo.
As implementações tem a liberdade de adicionar anotações e códigos a mais que desejarem, mas tem que implementar o básico que o JPA requeira.
O que o JPA nos propõem, é que seja possível trabalhar diretamente com as classes e não ter que utilizar as consultas nativas de cada banco de dados; o JPA irá fazer esse trabalho pelo desenvolvedor.

sábado, 6 de setembro de 2014

Hibernate e JPA

O Hibernate é uma ferramenta ORM open source e é a líder de mercado, sendo a inspiração para a especificação Java Persistence API (JPA). O Hibernate nasceu sem JPA mas hoje em dia é comum acessar o Hibernate pela especificação JPA. Como toda especificação, ela deve possuir implementações. Entre as implementações mais comuns, podemos citar: Hibernate da JBoss, EclipseLink da Eclipse Foundation e o OpenJPA da Apache. Apesar do Hibernate ter originado a JPA, o EclipseLink é a implementação referencial.

O Hibernate abstrai o seu código SQL, toda a camada JDBC e o SQL será gerado em tempo de execução. Mais que isso, ele vai gerar o SQL que serve para um determinado banco de dados, já que cada banco fala um "dialeto" diferente dessa linguagem. Assim há também a possibilidade de trocar de banco de dados sem ter de alterar código Java, já que isso fica de responsabilidade da ferramenta.