Mapeamentos JPA

De BIS Wiki
Revisão de 13h59min de 20 de março de 2015 por Rodrigogml (discussão | contribs) (Criou página com 'A camada de persistência do BIS é atualmente desenvolvida com base no JPA e uma estrutura própria do BISCore que simplifica a criação de DAOs. A implementação JPA utili...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

A camada de persistência do BIS é atualmente desenvolvida com base no JPA e uma estrutura própria do BISCore que simplifica a criação de DAOs. A implementação JPA utilizada atualmente é a nativa do Glassfish: a EclipseLink.

Esta página tem o objetivo de exemplificar os diferentes tipos de mapeamentos entre objetos e tipos diferentes de campos para servir como guia rápido de consulta para os desenvolvedores.

Mapeamento de Atributos

Mapeamento Entre Objetos

Elementos Orfãos de Mapeamentos
Note que por padrão o JPA não exclui os elementos que foram simplesmente removidos da lista/coleção do seu pai. Algumas implementações oferecem essa opção, como o próprio Hibernate que oferece a opção "delete-orphan".

No entanto essa opção não funcionará no BIS, pois fora da camada de persistência (DAOs) os objetos já foram completamente desanexados, o que o impede de monitorar e remover os objetos filhos. A lógica de remoção dos filhos não mais utilizados deve ser realizada no CRUD. Caso contrário o filho permanecerá no banco e anexado ao elemento pai. É recomendável também que essa análise e exclusão dos filhos não mais utilizados seja feita antes de outras alterações e persistência do objeto pai no banco para evitar inconsistência e "lock".

OneToMany - carregado em um Map

Imagine o objeto SchedulerVO, este tem uma coleção de SchedulerPropertyVO. Como mostram as tabelas abaixo:



SchedulerVO
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "schedulervo", fetch = FetchType.EAGER)
@MapKey(name = "name")
private Map<String, SchedulerPropertyVO> properties = new HashMap<String, SchedulerPropertyVO>();
SchedulerPropertyVO
@ManyToOne(cascade = CascadeType.REFRESH, optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "idcore_scheduler")
public SchedulerVO schedulervo = null;


OneToMany - carregado em uma List

Imagine o objeto SchedulerVO, este tem uma coleção de SchedulerPropertyVO. Como mostram as tabelas abaixo:



SchedulerVO
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "schedulervo", fetch = FetchType.EAGER)
private List<SchedulerPropertyVO> properties = new ArrayList<SchedulerPropertyVO>();
SchedulerPropertyVO
  @ManyToOne(cascade = CascadeType.REFRESH, optional = false, fetch = FetchType.LAZY)
  @JoinColumn(name = "idcore_scheduler")
  public SchedulerVO schedulervo = null;