Mapeando Entidades

CAMPOS COM COLEÇÕES

  1. Utilizar Set Evita MultipleBagFetchException e algumas abstrações do framework dependem da implementação do Set.

  2. Inicializar as coleções na declaração O framework utliza "Reflexão" para recuperar os campos, logo precisamos das coleções inicializadas para saber qual classe esta associada à coleção.

  3. Anotações com parâmetros obrigatórios

    1. FetchType Utilizar LAZY sempre que possível para buscar informações sob demanda e evitar problemas de performance.

    2. Cascade Utilizar ALL, MERGE ou PERSIST. O framework só inicializa as listas sob demanda, de forma automatica, quando estão anotadas com um desses tipos de cascade.

    3. MappedBy Necessário especificar o nome do campo na classe filho que referencia o parente (anotado no filho como @ManyTo*).

Para relacionamentos de muitos-para-muitos é recomendado mapear uma entidade para a tabela associativa e mapear um relacionamento de @OneToMany nas entidades das tabelas relacionadas para a entidade da tabela associativa (ao invés de mapear com @ManyToMany).

Exemplos:

ParenteVO.java
@Entity
@Table(name = "TB_PARENTE")
public class ParenteVO extends AppBaseVO {
	
	private Set<FilhoVO> filhos = new LinkedHashSet<>(); // (1) e (2) set inicializado

	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "nomeAtributoParente", orphanRemoval = true) // (3) anotação parametrizada
	public Set<FilhoVO> getFilhos() {
		return filhos;
	}

	public void setFilhos(Set<FilhoVO> filhos) {
		this.filhos = filhos;
	}
	
	// demais campos e métodos ocultados para brevidade
}

CAMPOS COM ENUMS

  1. Utilizar EnumType.STRING A Prodemge padroniza que os campos do tipo Enum sejam mapeados como String. Caráter obrigatório.

Exemplo:

@Enumerated(EnumType.STRING)
@Column(name = "CD_SITUACAO")
public SituacaoEscalaEnum getSituacao() {
	return situacao;
}

CAMPOS COM DATAS

  1. Utilizar Date (java.util.Date) Algumas abstrações do framework dependem de que as datas sejam mapeadas com Date.

É recomendado que se utilize temporal TIMESTAMP. No entanto, não existe uma regra. O importante é manter padronizado e consistente com o que foi escolhido.

Exemplo:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DT_ATENDIMENTO")
public Date getDataAtendimento() {
	return dataAtendimento;
}

CAMPOS COM BOOLEANOS

  1. Utilizar o prefixo "GET" Algumas abstrações do framework dependem que os campos mapeados tenham sempre o prefixo "get". Caso seja necessário utilizar o prefixo "is" deve-se criar um campo transiente.

Exemplo:

@Column(name = "IS_ENCAIXE")
public Boolean getEncaixe() {
	return encaixe;
}

public void setEncaixe(Boolean encaixe) {
	this.encaixe = encaixe;
}
	
@Transient
public Boolean isEncaixe() {
	return Boolean.TRUE.equals(getEncaixe());
}

Last updated