Captura o proximo id do GeneratedValue

6 respostas
71C4700

Teria com antes de persistir um objeto, recuperar o id que será sua chave?

Assim

Pessoa pessoa = new Pessoa("Alguem");

// Aqui tem os DAOs e Os Services e COnfiguraçõs e tao...

DAO dao = Service.getDAO(Pessoa.class);
dao.persit(pessoa);


// E no metodo do DAO

public void persist(Object obj){
   entityManeger.persist(obj);// Teria como recupera o id neste momento, mas antes do metodos realizar a persistencia?
}

Agradeço a todos

6 Respostas

Jair_Rillo_Junior

Eu acredito que só depois de ocorrer a persistência.

public void persist(Object obj) {
  entityManager.persist(objt);
  obj.getId(); //aqui você tem o ID, porém só após o persist()
}
E

Caso o seu campo seja um auto-incremento vc faria uma HQL para retornar o maior registro usando a clásula MAX, entao vc teria como saber o proximo id somando mais 1(um). antes de persistir.

Jair_Rillo_Junior

Mas e se nesse meio tempo, um novo registro foi persistido?? Por isso eu digo, tem que fazer um bom controle de concorrência ai.

E

Mas e se nesse meio tempo, um novo registro foi persistido?? Por isso eu digo, tem que fazer um bom controle de concorrência ai.

Concordo, ah esse “problema” num sequence, pois assim q invocado ele consome uma posicao. Mas eh soh uma dica, teria como controlar isso como uma query native mas nao vem ao caso, pois se ele mudasse a base de dados teria fazer outro tratamento soh para atender a nova base.

Jair_Rillo_Junior

Uma query nativa também não resolve. A questão é concorrencia. Para usar essa idéia, deve fazer um lock na tabela antes do SELECT e só libera-la após persistir os dados.

E

Com uma query native do postgresql vc pode controlar qdo ou nao uma sequence deve ser disparada.

Criado 17 de fevereiro de 2009
Ultima resposta 17 de fev. de 2009
Respostas 6
Participantes 3