Bom dia.
Estou estudando java/spring boot utilizando o postgresql como base de dados e estou com um duvida. Tenho o seguinte código na base:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "clinics")
public class ClinicEntity extends AbstractEntity {
@Column(nullable = false)
@NotNull(message = "Name is required")
@NotEmpty(message = "Name can't be empty")
private String name;
@Column(nullable = false)
@NotNull(message = "Email is required")
@NotEmpty(message = "Email can't be empty")
@Email(message = "Email is not valid")
private String email;
@Column(nullable = false, unique = true)
@NotNull(message = "CNPJ is required")
private Long cnpj;
}
que é a estrutura inicial das minhas entidades, dai tenho as implementações das entidades em si:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "clinics")
public class ClinicEntity extends AbstractEntity {
@Column(nullable = false)
@NotNull(message = "Name is required")
@NotEmpty(message = "Name can't be empty")
private String name;
@Column(nullable = false)
@NotNull(message = "Email is required")
@NotEmpty(message = "Email can't be empty")
@Email(message = "Email is not valid")
private String email;
@Column(nullable = false, unique = true)
@NotNull(message = "CNPJ is required")
private Long cnpj;
}
Da forma como está, ele gera uma sequence onde todas as entidades/tabelas compartilham, porém gostaria que fosse gerada uma sequence para cada tabela. Vi que tem como eu fazer isso definindo um nome para a sequence, porém como defino o ID na superclasse não sei como fazer isso de forma automática, é possível?
Uai, onde está a declaração da sequence?
Essa é a questão, eu não sei como colocar, eu poderia colocar ela ali na classe abstrada, mas dai tenho que definir um nome, que seria aplicado para todas outras entidades, o que não é o que eu queria.
Vc deve definir a sequence em cada classe, pois tem que colocar o nome da sequence, e cada tabela vai ter uma diferente. Ex.:
@Entity
@Table(name = "PESSOA")
@SequenceGenerator(name = "seq_pessoa", sequenceName = "seuSchema.seq_pessoa", allocationSize = 1)
class Pessoa {
@Id
@Column(name = "id_pessoa")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_pessoa")
private Long id;
// ....
}
Entendi, então não tem como eu delegar para o hibernate a criação de uma sequence por tabela de forma automatica? pois desta forma apresentada acima eu não posso deixar o id na entidade base (Classe abstrata) correto?
Não poderia, e nem recomendo. Se vc jogar o ID na classe abstrata, isso vai te causar algum problema em algum momento.
Mas ainda dá para abstrair o ID, basta usar generics na classe abstrata e criar um método para retornar o ID. Algo assim:
public abstract class AbstractEntity<ID> {
public abstract ID getId();
}
E a classe que vai herdar fica assim:
@Entity
@Table(name = "PESSOA")
@SequenceGenerator(name = "seq_pessoa", sequenceName = "seuSchema.seq_pessoa", allocationSize = 1)
public class Pessoa extends AbstractEntity<Long> {
@Id
@Column(name = "id_pessoa")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_pessoa")
private Long id;
@Override
public Long getId() {
return id;
}
}
Caso o ID precise ser de outro tipo e não precise de uma sequence, por exemplo:
@Entity
@Table(name = "TIPO_PESSOA")
public class TipoPessoa extends AbstractEntity<String> {
@Id
@Column(name = "id_tipo_pessoa")
private String id;
@Override
public String getId() {
return id;
}
}