Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como sei o id antes de salvar um objeto em jpa


Com um ID de tipo @GeneratedValue, você não pode saber esse valor antecipadamente (antes de realmente escrevê-lo). No entanto, uma vez que você persista seu Bean, o campo id será preenchido nessa instância do bean e você poderá obtê-lo sem precisar fazer uma consulta extra para ele. Em outras palavras:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();

Além disso, dependendo de como seu EntityManager estiver configurado, talvez seja necessário primeiro confirmar a transação (manualmente) antes de obter esse id.

Atualizar conforme comentário


Se você deseja interceptar e fazer algo com a entidade antes que ela seja salva e/ou atualizada, você pode usar JPA LifeCycle Listeners (se estiver usando JPA versão 2):Manipulando o evento de ciclo de vida JPA usando listeners e callbacks.

Basicamente você pode fazer um validate() método em seu bean, anote-o com @PrePersist e @PreUpdate e faça a validação nele (se o código estiver vazio, defina-o para o valor do id)

Atualização por segundo comentário


Sim, honestamente, acabei de pensar nisso agora:se o id for gerado automaticamente, ele poderá ser preenchido APÓS o evento pré-persistir, de modo que, quando seu código pré-persistir for executado, você ainda não saberá qual é o id (você pode notar também que no exemplo o link para o id NÃO é gerado automaticamente, mas definido manualmente). O que você pode fazer neste caso é adicionar um campo booleano à sua entidade (anotado com @Transient para que não persista) chamado isCodeEmpty (que é falso por padrão se não for inicializado especificamente). Em seguida, em seu @PrePersist anotado, você verifica se o valor do campo de código está vazio e, em caso afirmativo, define o booleano como true. Então você refatora seu setId(...) método tal que (além de definir o campo id) ele irá verificar este booleano, e se true defina o valor do campo de código para aquele do campo id:
public class YourEntity {

@Transient
private boolean isCodeEmpty;

public void setId(Whatever id) {
 this.id = id;
 if(isCodeEmpty) {
  this.code = id;
  //if necessary:
  //this.isCodeEmpty = false;
 }
}

@PrePersist
public void validate() {
 if(code == null || code.isEmpty()) {
  isCodeEmpty = true;
 }

}


}