unidirectional onetomany one mappedby manytoone many ejemplo hibernate jpa order jpa-2.0 one-to-many

onetomany - Anotación de JPA 2.0 @OrderColumn en Hibernate 3.5



one to one jpa (3)

Debería intentar especificar OrderColumn en el propietario de la asociación. O en su mapeo usted coloca al propietario en el niño, el dueño debe ser el padre (en una asociación bidireccional, el propietario es el que no tiene la palabra clave mapeadaPor, aquí pone esta palabra clave en la clase del padre, entonces usted significa que la clase de los padres no es el dueño)

En su clase de niños, debe tener la palabra clave mappedBy en parentCollection. Pero no en la Colección de niños.
Y en tu clase para padres deberías tener la anotación @JoinTable, algo como esto:

@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) @OrderColumn(name = "pos") @JoinTable( name = "<NAME_OF_YOUR_TABLE>", joinColumns = @JoinColumn( <JOIN_COLUMNS_...> ) private List<Children> childrenCollection;

Estoy tratando de usar la anotación @OrderColumn con Hibernate 3.5

@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) @OrderColumn(name = "pos") private List<Children> childrenCollection;

Al recuperar datos, todo funciona bien. Pero no puedo hacer que reordene elementos en la Lista y guarde la nueva orden en la base de datos.


Haz algo como esto:

@Entity class Parent { @OneToMany @OrderColumn(name = "pos") List<Child> children; } @Entity class Child { @ManyToOne Parent parent; @Column(name = "pos") Integer index; @PrePersist @PreUpdate private void prepareIndex() { if (parent != null) { index = parent.children.indexOf(this); } } }


La combinación de @OneToMany (mappedBy = "...") y @OrderColumn no es compatible con Hibernate. Este problema JIRA rastrea una solicitud para arrojar un mensaje de error más obvio cuando se utiliza esta combinación no válida: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5390

Creo que esto no se admite principalmente porque es un patrón relacional extraño. Las anotaciones anteriores indican que el lado "uno" de la relación determina cómo se va a enjuagar la relación a la base de datos, pero el orden / posición solo está disponible en el lado "muchos" al examinar la Lista. Tiene más sentido para el lado "muchos" poseer la relación, ya que ese lado conoce tanto la membresía como el orden de los elementos.

Los documentos de Hibernate Annotations describen esta situación con cierto detalle:

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-extratype-indexbidir

La solución consiste en eliminar el atributo "mappedBy", que hará que la asociación utilice la estrategia de tabla de combinación predeterminada en lugar de una columna en la tabla de destino. Puede especificar el nombre de la tabla de unión utilizando la anotación @JoinTable.

El efecto neto de este cambio es que el lado "muchos" de la relación ahora determina cómo persiste la relación. Su código de Java necesita asegurarse de que la Lista se actualice correctamente, ya que Hibernate ahora ignorará el lado "uno" al enjuagar las entidades.

Si aún desea tener el lado "uno" accesible en Java, haga un mapa con

@ManyToOne @JoinColumn(name="...", insertable=false, updatable=false, nullable=false)