====== Creación de Padres e Hijos en un solo Persist ====== Tenemos un modelo en el que tenemos una entidad (que llamaremos padre) relacionada con otra mediante un //@OneToMany// (que llamaremos hijos). Los hijos tienen una clave primaria compuesta, en la que aparece la clave primaria del padre (clave foránea). Podemos crear el padre y los hijos mediante un solo //persist//, vamos un ejemplo: Tenemos la entidad //Documento// (el padre) que dentro puede contener una lista de //Firmante//s (los hijos) relación //@OneToMany//: public class Documento implements java.io.Serializable { private List firmantes = new ArrayList(); @OneToMany(fetch = FetchType.LAZY, mappedBy = "documento", cascade = CascadeType.ALL) public List getFirmantes() { return this.firmantes; } public void setFirmantes(List firmantes) { this.firmantes = firmantes; } } Para no tener que hacer un //persist// explícito del objeto _Firmante_, en la relación //@OneToMany// he establecido un //CascadeType.ALL//. La entidad //Firmante// tiene una clave primaría compuesta por el par documento, identificador del firmante. @Entity @Table(name = "GDOC_FIRMANTES_DOC", schema="GESPERDOC") public class Firmante implements java.io.Serializable { private Firmanted id; private Documento documento; public Firmante() { } @EmbeddedId @AttributeOverrides({ @AttributeOverride(name = "doc", column = @Column(name = "GFD_DOC", nullable = false, precision = 10, scale = 0)), @AttributeOverride(name = "identificador", column = @Column(name = "GFD_IDENTIFICADOR", nullable = false, length = 8))}) @NotNull public FirmanteId getId() { return this.id; } public void setId(FirmanteId id) { this.id = id; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "GFD_DOC", nullable = false, insertable = false, updatable = false) @NotNull public Documento getDocumento() { return this.documento; } ... } Cuando creo una instancia del firmante, como el documento aún no ha sido persistido no existe el //ID// y por lo tanto no lo establece en //FirmanteId//. Además, aunque le asocio la entidad el documento, como dicha relación tiene las propiedades //insertable// y //updatable// a false (pues si no fallaría por propiedad duplicada), cuando se realiza el //persist// de todo, aunque primero se haga el del documento no le asigna su //ID// al firmante. Para solventar dicho problema en la clase //Firmante// he hecho uso del listener //PrePersist//: @PrePersist public void prepersist() { if (getDocumento() != null) { getId().setDoc( getDocumento().getId() ); } } ---- --- //[[juan.ferrer@ticarum.es|Juan Ferrer Martínez]] 2017/02/15 18:13//