Pregunta ¿Cómo puedo usar el valor generado dentro de las claves compuestas?


Tengo dos clases documentlog y documentversion (con claves principales: int doc_id e int docVersionID) con una relación muchos a uno. Usé una clase de clave compuesta llamada CompundKey para administrar la clave primaria compuesta. Necesito auto incrementar el docversionID pero no puedo hacer eso. ¿Podría ayudarme en este sentido?

@Entity
@Table(name = "Documentversion", schema = "DocumentManagement")
public class DocumentVersion implements Serializable { 

 private CompoundKey id;
 private List<DocumentLog> documentLog;

 @OneToMany(mappedBy="documentVersion", targetEntity=DocumentLog.class,  
   cascade ={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
 public List<DocumentLog> getDocumentLog() {
  return documentLog;
 }
 public void setDocumentLog(List<DocumentLog> documentLog) {
  this.documentLog = documentLog;
 }

 @EmbeddedId 
 @AttributeOverride(name="doc_Id", column=@Column(name="doc_Id") )
 public CompoundKey getId() {
  return id;
 }
 public void setId(CompoundKey id) {
  this.id = id;
 } 
}

12
2017-11-08 00:13


origen


Respuestas:


La documentación es un poco confusa sobre este tema ...

Que yo sepa, las claves compuestas siempre tenían que ser asignado por la aplicación (es decir, no generado) al menos con JPA estándar pero también con Hibernate Core:

8.4. Componentes como identificadores compuestos

...

No puedes usar un IdentifierGenerator   para generar claves compuestas En lugar   la aplicación debe asignar su propio   identificadores.

Pero las cosas pueden ser un poco diferentes en la práctica (ver HHH-2060 y / o este hilo para una alternativa usando un CompositeUserType junto con un IdentifierGenerator).

Ahora, la parte más confusa, de la documentación de Hibernate Annotations 3.5:

2.2.3.2.4. Generación de identificador parcial

Hibernate es compatible con la automática   generación de algunos de los identificadores   propiedades. Simplemente usa el    @GeneratedValue anotación en uno o   varias propiedades de identificación.

...

También puede generar propiedades dentro de un @EmbeddedId clase.

(y lea también la advertencia del equipo de Hibernate en contra de usar esta característica).

Aunque no tengo ninguna experiencia práctica con eso.

Referencias


12
2017-11-08 05:50



Es posible declarar tu propio generador para @EmbeddedId para usar la secuencia para la generación de Id.

Además, necesitarás declarar entidad falsa para crear secuencia automáticamente


0
2018-03-18 14:33