Definindo entidades JPA
1. Introdução
Neste tutorial, aprenderemos sobre os conceitos básicos de entidades, juntamente com várias anotações que definem e personalizam uma entidade em JPA.
2. Entidade
As entidades na JPA nada mais são que POJOs que representam dados que podem ser persistidos no banco de dados. Uma entidade representa uma tabela armazenada em um banco de dados. Cada instância de uma entidade representa uma linha na tabela.
2.1. A anotaçãoEntity
Digamos que temos um POJO chamadoStudent que representa os dados de um aluno e gostaríamos de armazená-los no banco de dados.
public class Student {
// fields, getters and setters
}
Para fazer isso, devemos definir uma entidade para que a JPA esteja ciente disso.
Então, vamos definir isso usando a anotação@Entity. Nós devemos especificar esta anotação no nível da classe. We must also ensure that the entity has a no-arg constructor and a primary key:
@Entity
public class Student {
// fields, getters and setters
}
O nome da entidade assume como padrão o nome da classe. Podemos mudar seu nome usando o elementoname.
@Entity(name="student")
public class Student {
// fields, getters and setters
}
Como várias implementações de JPA tentarão criar uma subclasse de nossa entidade para fornecer sua funcionalidade,entity classes must not be declared final.
2.2. A anotaçãoId
Cada entidade JPA deve ter uma chave primária que a identifique exclusivamente. The @Id annotation define a chave primária. Podemos gerar os identificadores de diferentes maneiras que são especificadas pela anotação@GeneratedValue.
Podemos escolher entre quatro estratégias de geração de id com o elementostrategy. The value can be AUTO, TABLE, SEQUENCE, or IDENTITY.
@Entity
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
// getters and setters
}
Se especificarmosGenerationType.AUTO, o provedor JPA usará qualquer estratégia que desejar para gerar os identificadores.
Se anotarmos os campos da entidade, o provedor JPA usará esses campos para obter e definir o estado da entidade. Além de Field Access, também podemos fazer Property Access ou Mixed Access, o que nos permite usar tanto Field quanto Property access na mesma entidade.
2.3. A anotaçãoTable
Na maioria dos casos,the name of the table in the database and the name of the entity will not be the same.
Nestes casos, podemos especificar o nome da tabela usando a anotação@Table:
@Entity
@Table(name="STUDENT")
public class Student {
// fields, getters and setters
}
Também podemos mencionar o esquema usando o elementoschema:
@Entity
@Table(name="STUDENT", schema="SCHOOL")
public class Student {
// fields, getters and setters
}
O nome do esquema ajuda a distinguir um conjunto de tabelas de outro,
Se não utilizarmos a anotação@Table, o nome da entidade será considerado o nome da tabela.
2.4. A anotaçãoColumn
Assim como a anotação@Table, podemos usar a anotação@Column para mencionar os detalhes de uma coluna na tabela.
A anotação@Column tem muitos elementos comoname, length, nullable, and unique.
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
// other fields, getters and setters
}
O elementoname especifica o nome da coluna na tabela. O elementolength especifica seu comprimento. O elementonullable especifica se a coluna pode ser anulada ou não, e o elementounique especifica se a coluna é exclusiva.
Se não especificarmos essa anotação, o nome do campo será considerado o nome da coluna da tabela.
2.5. A anotaçãoTransient
Às vezes, podemos querermake a field non-persistent. Podemos usar a anotação@Transient para fazer isso. Especifica que o campo não será persistido.
Por exemplo, podemos calcular a idade de um aluno a partir da data de nascimento.
Então, vamos anotar o campoage com a anotação@Transient:
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false)
private String name;
@Transient
private Integer age;
// other fields, getters and setters
}
Como resultado, o campoage não será persistido na tabela.
2.6. A anotaçãoTemporal
Em alguns casos, podemos ter que salvar valores temporais em nossa tabela.
Para isso, temosthe @Temporal annotation:
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
@Transient
private Integer age;
@Temporal(TemporalType.DATE)
private Date birthDate;
// other fields, getters and setters
}
No entanto, com JPA 2.2, também temos suporte parajava.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime ejava.time.OffsetDateTime.
2.7. A anotaçãoEnumerated
Às vezes, podemos querer persistir um tipo Javaenum.
Podemos usar a anotação@Enumerated para especificar seenum deve ser persistido por nome ou ordinal (padrão).
public enum Gender {
MALE,
FEMALE
}
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="STUDENT_NAME", length=50, nullable=false, unique=false)
private String name;
@Transient
private Integer age;
@Temporal(TemporalType.DATE)
private Date birthDate;
@Enumerated(EnumType.STRING)
private Gender gender;
// other fields, getters and setters
}
Na verdade,we don’t have to specify the @Enumerated annotation at all if we are going to persist the Gender by the enum‘s ordinal.
No entanto, para persistir oGender pelo nome deenum, configuramos a anotação comEnumType.STRING.
3. Conclusão
Neste artigo, aprendemos o que são entidades JPA e como criá-las. Também aprendemos sobre as diferentes anotações que podem ser usadas para personalizar ainda mais a entidade.
O código completo para este artigo pode ser encontradoover on Github.