2009-05-14 22 views
7

Tengo una asignación @ManyToMany donde la tabla se autoreferencia a través de una tabla de asignación, y queremos pedir una identificación de la orden en la tabla de asignación real, pero les resulta difícil configurar esto .Ordenando al asignar el valor de la tabla en Hibernate

Podríamos realizarlo en hibernate xml, por lo que es natural suponer que el soporte está ahí en las anotaciones JPA. ¿Alguien sabe cómo podemos pedir un valor en la tabla de mapeo?

la mesa es:

wap_site_components 

intid 
strname 
intcomponentdef 
dtmcreated  
intcustomer 

y la tabla de asignación que se auto-referencias es:

wap_site_component_relations 

intid  
intparent (references intid in wap_site_components) 
intchild (references intid in wap_site_components) 
intorder (this is the value we want to order the collection on) 

En Anotaciones de Hibernate tenemos:

@ManyToMany (fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JoinTable (name = "wap_site_component_relations", 
    joinColumns = {@JoinColumn (name = "intparent", referencedColumnName = "id") }, 
    inverseJoinColumns = {@JoinColumn (name = "intchild", referencedColumnName = "id") }) 
public Set<WapComponent> getChildren() { 
    return children; 
} 

Ésta es la forma en que realizamos en hibernate xml:

 <set 
      name="children" 
      table="wap_site_component_relations" 
      lazy="true" 
      cascade="none" 
      sort="unsorted" 
      order-by="intorder" 
      mutable="false" 
     > 
      <cache 
      usage="read-only" 
      /> 

      <key 
      column="intparent" 
      > 
      </key> 

      <many-to-many 
      class="se.plusfoursix.im46.data.wap.WapComponent" 
      column="intchild" 
      outer-join="auto" 
      /> 

     </set> 

Por lo tanto, queremos utilizar la etiqueta @OrderBy pero no podemos hacer referencia al valor de intorder en la tabla de asignación. ¿Algunas ideas? Gracias.

(Hemos probado una @OrderBy (intorder) sobre la colección de los niños en el código pero que no ha funcionado para nosotros)

+1

También debo añadir aquí que podríamos hacer esto haciendo que la tabla de asignación de un grano, pero preferiría no hacerlo. – bowsie

Respuesta

0

Terminamos creando la tabla de asignación como un bean.

Si alguien tiene una manera de realizar lo anterior sin eso, aún estaría feliz de saber de usted!

+0

He encontrado el mismo problema y he recurrido a resolver de la misma manera. – Heathen

+0

Esto es triste. –

2

Se puede crear un objeto anotado para representar a la mesa de enlace, a continuación, utilizar @OneToMany para mapear desde el padre al enlace hijo y luego al niño

@Entity 
public class Parent { 
    @id 
    Long id; 

    @OneToMany(targetEntity = ChildLink.class) 
    Set<ChildLink> childLinks; 
} 

public class ChildLink { 

    @Id 
    @OrderBy 
    Long orderBy; 

    @ManyToOne 
    Set<Parent> parents; 

    @ManyToOne 
    Set<Child> children; 
} 

Apenas un ejemplo áspero. A continuación, puede generar programáticamente los elementos secundarios del conjunto de enlaces secundarios, tal vez en el método getChildren de la clase principal.

Cuestiones relacionadas