[RESOLVIDO] Um único ID para o sistema todo no BD? JPA

Olá pessoal!!
Estou fazendo meu sistema utilizando JPA e postgres.

O problema que está ocorredo é que o meu ID está sendo único no meu BD inteiro e não somente nas tabelas, o que tá deixando um intervalo de números entre um código e outro dentro de uma mesma tabela, ou seja, na hora de cadastrar algo, verifica-se o último ID cadastrado no BD, e é somado +1 ao número.

Ou seja:
Eu tenho a classe Pessoa e a classe Usuario
Onde na classe Pessoa tem:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Pessoa implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long codigoPessoa;

E na classe Usuario tem:

@Entity
public class Usuario implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long codigoUsuario;

Por exemplo ao cadastrar uma Pessoa, é feito primeiro o persist de Usuario e depois persist Pessoa no BD.
Mostro a seguir o que ocorre no BD:
Na tabela usuario é feito insert com o codigoUsuario 1.
Na tabela pessoa é feito insert com o codigoPessoa 2.

Se eu inserir mais uma pessoa, na tabela Usuario vai o códigoUsuario 3 e na Pessoa vai o codigoPessoa 4.

Ou seja, fica sempre com buracos os números na minha tabela.
O que eu quero fazer é que o ID seja único na tabela e não no BD inteiro…

No Postgres a tabela Pessoa é:

-- Table: pessoa

-- DROP TABLE pessoa;

CREATE TABLE pessoa
(
  codigopessoa int8 NOT NULL,
  ativo bool NOT NULL,
  CONSTRAINT pessoa_pkey PRIMARY KEY (codigopessoa)
) 
WITH OIDS;
ALTER TABLE pessoa OWNER TO postgres;

E a tabela Usuario:

-- Table: usuario

-- DROP TABLE usuario;

CREATE TABLE usuario
(
  codigousuario int8 NOT NULL,
  senha varchar(10) NOT NULL,
  codigotipousuario int8 NOT NULL,
  CONSTRAINT usuario_pkey PRIMARY KEY (codigousuario),
  CONSTRAINT fk5b4d8b0e43c9cb36 FOREIGN KEY (codigotipousuario) REFERENCES tipousuario (codigotipousuario) ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT usuario_loginusuario_key UNIQUE (loginusuario)
) 
WITH OIDS;
ALTER TABLE usuario OWNER TO postgres;

Alguém sabe como resolver isso??
Agradeço desde já…

Não ficaria melhor Usuario ter um FK de pessoa?

Olá,
Na verdade tenho uma outra classe Funcionario que extends Pessoa.
E tenho uma tabela funcionario onde tem FK pessoa e usuario…

O meu problema não é esse…
[color=red]
O problema que está ocorrendo é que o meu sistema ao dar o persist está buscando no BD o último ID cadastrado não importa de que tabela, e incrementa 1 ao novo código.
[/color]

Isso que eu gostaria de resolver, alguém sabe como??
Agradeço desde já!

Pessoal, alguém saberia como resolver o meu problema???

Creio que seu problema seja na anotação GeneratedValue, altere a estratégia e faça os testes.
Existem quatro estratégias a se saber: AUTO, SEQUENCE, IDENTITY e TABLE.
Uma delas resolvera o seu problema.

Extreme_X, obrigada pela resposta, não estou com meu sistema em mãos, mas assim que estiver, farei o que disse e posto qual das estratégias resolveu o problema.

Obrigada novamente!!:slight_smile:

Disponha! Espero que resolva, caso contrário continuamos procurando a solução. :smiley:

Extreme_X, muito muito muito obrigada!! Funcionou!!! :smiley: :smiley:

Coloquei como estratégia TABLE!! :slight_smile:

@Entity
public class Consulta implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long codigoConsulta;

Achei que não teria solução o meu problema!!! Obrigada novamente!!
Só uma coisa que eu reparei, após essa mudança, houve a criação de uma nova tabela no meu BD (Postgres), segue abaixo o código da tabela:

-- Table: hibernate_sequences

-- DROP TABLE hibernate_sequences;

CREATE TABLE hibernate_sequences
(
  sequence_name character varying(255),
  sequence_next_hi_value integer
)
WITH (
  OIDS=FALSE
);
ALTER TABLE hibernate_sequences OWNER TO postgres;

Onde por exemplo tem os seguintes dados:

sequence_name | sequence_next_hi_value Pessoa 2 Plano 1 Especialidade 3 Usuario 2
Essa tabela seria para controlar os meus ID’s, é isso?

Fico feliz que tenha resolvido!

Bem, sobre a nova tebela, pelo que entendi ele criou a mesma para controlar a seqüência dos ID’s.
Ele armazena o id atual ou o posterior?
Uma dúvida, as tabelas no banco estão com a propriedade auto_increment ativada?

Extreme_X…
Vi que estava meio esquisito, não estava armazenando nem o atual, nem o posterior e nem o anterior na tabela que foi criada (hibernate_sequences).

Além disso os meus ID’s no BD não estavam como serial.
E após alguns testes o ID começou a dar problema novamente.

Então resolvi mudar a estratégia. Coloquei como IDENTITY:

@Entity
public class Agenda implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigoAgenda;

Após isso, excluí o meu BD. Rodei o sistema com essa mudança e não foi criado a tabela hibernate_sequences!!
E não deu mais problema o ID!!! :smiley: :smiley: :smiley: :smiley:

[color=red]Conclusão: A estratégia correta a ser utilizada é: IDENTITY[/color]
Com isso, os ID’s ficaram como serial no meu BD!!
:smiley:

Extreme_X OBRIGADA OBRIGADA OBRIGADA NOVAMENTE!!

:smiley: