Criação da Entidade JPA
A entidade JPA é uma classe Java que é mapeada para uma tabela no banco de dados. Ela representa a estrutura da tabela através de seus atributos e relacionamentos com outras tabelas. A seguir, é apresentada a entidade TopicoEntity, que inclui campos básicos e um relacionamento com ela mesma para representar a hierarquia de tópicos.
package com.webpublico.ead.infrastructure.persistence.entity.academico;
import com.webpublico.ead.infrastructure.persistence.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "topico")
@NoArgsConstructor
@Getter
@Setter
public class TopicoEntity extends BaseEntity {
@Column(nullable = false, length = 500)
private String titulo;
@Column(nullable = false, columnDefinition = "TEXT")
private String descricao;
@ManyToOne
@JoinColumn(name = "nivel_anterior_id")
private TopicoEntity nivelAnteriorEntity;
}
Explicação
BaseEntity: TopicoEntity herda de BaseEntity, que inclui campos comuns como id, ativo, codigo, versao, dh_criacao, dh_atualizacao, usuario_criou, ultimo_usuario_alterou, dh_exclusao, usuario_excluiu e tenant_id. Isso garante que todas as entidades tenham um tratamento uniforme para essas propriedades básicas e auditoria.
Relacionamentos e Listas
No domínio, as listas são usadas para expressar relacionamentos de um-para-muitos, como um tópico que pode ter várias disciplinas associadas. Entretanto, na entidade JPA, esses relacionamentos são geridos manualmente para maior controle e performance, evitando o uso de @OneToMany diretamente, que pode levar à carga desnecessária de dados e problemas de performance.
Exemplo de uma classe de associação manual:
package com.webpublico.ead.infrastructure.persistence.entity.academico;
import com.webpublico.ead.infrastructure.persistence.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.UUID;
@Entity
@Table(name = "topico_disciplina")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class TopicoDisciplina extends BaseEntity {
@ManyToOne
@JoinColumn(name = "topico_id")
private TopicoEntity topicoEntity;
@ManyToOne
@JoinColumn(name = "disciplina_id")
private DisciplinaEntity disciplinaEntity;
@PrePersist
public void prePersist() {
if (id == null) {
id = UUID.randomUUID().toString();
}
}
}
Este método de mapeamento manual proporciona maior flexibilidade e otimização, permitindo que o controle total sobre as operações de banco de dados;
Convenções de Nomeação
Variáveis de Relacionamento
- As variáveis que representam entidades relacionadas devem ter o sufixo
Entitypara clareza e consistência.- Exemplos:
private TopicoEntity nivelAnteriorEntity;private TopicoEntity topicoEntity;private DisciplinaEntity disciplinaEntity;
- Exemplos:
Nome da Tabela
- O nome da tabela especificado na anotação
@Tablenão deve incluir o sufixoEntity.- Exemplos:
@Table(name = "topico")@Table(name = "topico_disciplina")
- Exemplos:
Chave Estrangeira
- As chaves estrangeiras devem ser nomeadas sem o sufixo
Entity, mas devem terminar em_idpara indicar claramente a sua função.- Exemplos:
@JoinColumn(name = "nivel_anterior_id")@JoinColumn(name = "topico_id")@JoinColumn(name = "disciplina_id")
- Exemplos: