Gerar automaticamente sequence por tabela (Spring boot/postgresql)

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;
	}
}