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