[Resolvido] Retornar valor autogerado pela base de dados JPA2

5 respostas
E

Olá,

Estou usando EclipseLink com JPA2. E tenho um annotation:

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;`

E gostaria que quando fosse fazer um insert, para eu fazer o insert dos próximos valores que dependem desse, trazer o id dele depois que foi inserido:

em.persist(entity);
        
        em.flush();
        entity.setId(em.getGeneratedId()); //essa linha eu inventei, não funciona e não existe
        for(PageAccess pa:entity.getPageAccessSet()){
            em.persist(pa);
        }

E gostaria de saber como esse valor do ID gerado para minha entidade seja retornado para o PageAccess pudesse ser gravado (está dando erro de NULL no id da entidade PAI)

O mais próximo que encontrei, foi essa annotation:

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#How_to_Use_the_.40ReturnInsert_Annotation

Mas o ReturnInsert está dando erro pois estou usando o EclipseLink do Glassfish, só com as anotações do JPA2.

E também encontrei:

http://forum.springsource.org/showthread.php?69153-How-do-I-get-the-Generated-Sequence-Value-after-insert

Mas não existe classe Session com esse atributo no JPA2. Se alguém souber como resolver isso eu agradeço muito

5 Respostas

E

Aproveitando esse tópico, estou tendo um outro problema, estou usando uma anotação nessa mesma classe:

@OneToMany(cascade = CascadeType.REMOVE, mappedBy = "systemUser") private Set<PageAccess> pageAccessSet;
e essa anotação está me trazendo elementos repetidos no set, ainda não consegui identificar o que pode ser (na tabela não existe elementos repetidos), se alguém tiver uma ideia do que seja e puder me ajudar.

E

Se alguém puder me ajudar com essas dúvidas, eu agradeço muito, estou precisando delas e não estou conseguindo resolver.

E

sobre os valores duplicados, estou mapeando o que pode estar acontecendo, e:

  • o método equals do meu PageAccess está retornando quase sempre false
  • Isso ocorre porque o EmbeddedId não está sendo inserido pelo JPA, alguém sabe como posso fazer para o EmbeddedId ser inserido pelo JPA? Ou tenho que colocar no construtor do objeto e nos setters e getters dos objetos relacionados para instanciar uma nova classe referenciada pelo EmbeddedId?
E

Bom, coloquei no construtor e nos setters e getters dos objetos relacionados instanciar a classe referenciada pelo EmbeddedId e solucionou o segundo ponto, só falta o primeiro agora, de obter o id autogerado pela base de dados (um campo Serial do postgre)

E

Bom, consegui.

Encontrei na doc do eclipselink
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Example_generated_id_annotation


Object’s id is not assigned after persist.
Identity sequencing requires the insert to occur before the id can be assigned, so it is not assigned on persist like other types of sequencing. You must either call commit() on the current transaction, or call flush() on the EntityManager. It may also be that you did not set your primary key column in your table to be an identity type.
Child’s id is not assigned from parent on persist.
A common issue is that the generated Id is part of a child object’s Id through a OneToOne or ManyToOne mapping. In this case, because JPA requires that the child define a duplicate Basic mapping for the Id, its Id will be inserted as null. One solution to this is to mark the Column on the Id mapping in the child as insertable=false, updateable=false, and define the OneToOne or ManyToOne using a normal JoinColumn this will ensure the foreign key field is populated by the OneToOne or ManyToOne not the Basic. Another option is to first persist the parent, then call flush() before persisting the child.

Resumindo, peguei o set de instâncias filhas, atribui null para a propriedade set de instancias filhas do pai, fiz o persist do pai, depois fiz o flush, reatribui pai para cada filha depois do flush, e persisti as instâncias filhas.

Vou marcar resolvido no título.

Criado 25 de agosto de 2011
Ultima resposta 26 de ago. de 2011
Respostas 5
Participantes 1