Упорядочение по отображению значения таблицы в Hibernate - PullRequest
7 голосов
/ 14 мая 2009

У меня есть отображение @ManyToMany, где таблица самостоятельно ссылается на таблицу отображения, и мы хотим заказать идентификатор заказа в фактической таблице отображения, но нам трудно это настроить.

Мы могли бы выполнить это в hibernate xml, поэтому естественно предположить, что поддержка есть в аннотациях JPA. Кто-нибудь знает, как мы можем заказать на значение в таблице сопоставления?

Таблица:

wap_site_components

intid
strname
intcomponentdef
dtmcreated      
intcustomer 

и таблица отображения, на которую ссылаются сами:

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)

В аннотациях Hibernate имеем:

@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;
}

Вот как мы выполнили это в 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>

Итак, мы хотим использовать тег @OrderBy, но не можем ссылаться на значение intorder в таблице отображения. Есть идеи? Спасибо.

(Мы пробовали @OrderBy (intorder) над коллекцией детей в коде, но у нас это не сработало)

Ответы [ 3 ]

2 голосов
/ 14 мая 2009

Вы можете создать аннотированный объект для представления таблицы ссылок, а затем использовать @oneToMany для сопоставления родительского элемента с дочерним, а затем с дочерним

@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;
}

Просто грубый пример. Затем вы можете программно создать набор потомков из набора childLinks, возможно, в методе getChildren родительского класса.

0 голосов
/ 26 мая 2015

Может быть сделано с @ OrderColumn

http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html?is-external=true

@Entity
public class CreditCard {

   @Id long ccNumber;

   @OneToMany  // unidirectional
   @OrderColumn
   List<CardTransaction> transactionHistory;
   ...
}
0 голосов
/ 15 мая 2009

В итоге мы создали таблицу сопоставления в виде бина.

Если у кого-то есть способ выполнить вышеизложенное без этого, все равно буду рад услышать от вас!

...