JPA/Hibernate - obter id antes da persistência do pojo

É claro que não é usual, mas infelizmente existem razões para isto ser assim, pois os dados a serem salvos só podem ser produzidos após a existência do ID (chave).

Há alguns anos com o Hibernate resolvemos isto criando um DAO gerador de IDs, e nele infelizmente usávamos queries nativas como “select seq.nextval from dual” (para Oracle).

Enfim, que tipo de soluções vocês já criaram, ou sugerem para este tipo de problema. Odiaria ter novamente queries nativas e/ou ter que consultar uma sequence manualmente.

Obrigado.

Você pode usar a solução que o seufagner colocou, só lembre-se que você não pode usar o persist()

http://plentz.org/2007/02/13/hibernate-save-ou-persist/

Boa Tarde Pessoal…
Alguem sabe dar RollBack da maneira certa sem apresentar erros… Eu ja tentei assim…
em.getTransaction().setRollbackOnly();
em.getTransaction().getRollbackOnly();
em.getTransaction().rollback();
todas deram o erro:

javax.ejb.EJBTransactionRolledbackException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager

Obrigado.

[quote]É claro que não é usual, mas infelizmente existem razões para isto ser assim, pois os dados a serem salvos só podem ser produzidos após a existência do ID (chave).
[/quote]

Cara, se você precisa da próxima PK obtida a partir de uma sequence, você persiste o POJO, utiliza este Id gerado. Caso aconteça alguma exceção você dá um rollback (isto é gerenciado automagicamente, mas você pode pode usar JTA na unha)

Para obter o nextval, configure uma sequence para o seu Id:

[code]@Entity
class X {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=“NOME_DA_SEQUENCE”)
private int Id;

}[/code]

[]s