2011-07-20 9 views
10

Próbuję utworzyć nadrzędne tabele potomne, w których zamówienie zostało zachowane. Przykład 7.8 z dokumentacją hibernacji pokazuje jak to zrobić:Kolumna @OrderColumn, @OneToMany & null index dla kolekcji

@Entity 
public class Customer { 
    @Id @GeneratedValue public Integer getId() { return id; } 
    public void setId(Integer id) { this.id = id; } 
    private Integer id; 

    @OneToMany(mappedBy="customer") 
    @OrderColumn(name="orders_index") 
    public List<Order> getOrders() { return orders; } 
    public void setOrders(List<Order> orders) { this.orders = orders; } 
    private List<Order> orders; 
} 

@Entity 
public class Order { 
    @Id @GeneratedValue public Integer getId() { return id; } 
    public void setId(Integer id) { this.id = id; } 
    private Integer id; 

    public String getNumber() { return number; } 
    public void setNumber(String number) { this.number = number; } 
    private String number; 

    @ManyToOne 
    public Customer getCustomer() { return customer; } 
    public void setCustomer(Customer customer) { this.customer = customer; } 
    private Customer number; 
} 

z http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-indexed

Kiedy próbuję to pojawia się błąd: zerowej kolumnie indeksu dla kolekcji

Jest Hibernate problem, który opisuje problem i daje niepoprawny przykład, ale wyraźnie mówi, że przykład podany powyżej z dokumentów jest ważny.

@Entity 
public class Parent { 
    @OneToMany(mappedBy="parent") 
    @OrderColumn(name="order") 
    private List<Child> children; 
} 

@Entity 
public class Child { 
    @ManyToOne 
    private Parent parent; 
} 

od: https://hibernate.onjira.com/browse/HHH-5390

Może mam być gęsta, ale nie widzę różnicy pomiędzy tymi dwoma przykładami. Jednym z nich jest:

@OneToMany(mappedBy="customer") 
@OrderColumn(name="orders_index") 

Drugi to:

@OneToMany(mappedBy="parent") 
@OrderColumn(name="order") 

I oczywiście, nie zorientowali się, jak do OrderColumn dostać się do pracy. Czy ktokolwiek ma jakiś wgląd w to, dlaczego jeden z tych przykładów jest ważny, a drugi nie?

Odpowiedz

7

Błąd dotyczy Hibernate 3.5.3, podczas gdy dokumentacja odnosi się do Hibernate 3.6. W moim rozumieniu z komentarzy usunięto problem: HHH-5390. Z której wersji Hibernate korzystasz? Pamiętaj, że musisz mieć kolumnę o dokładnie określonej nazwie w @OrderCoulumn.

Zobacz także ten numer discussion i obejść go w przypadku wersji 3.5.


Aktualizacja

Najwyraźniej nadal obsługiwane i nie jest to błąd dokumentacji w sposób opisany przez HHH-5732. Myślałem z HHH-5390, że osoba, której został przydzielony (ten, który jest właścicielem HHH-5390) zgodziła się to naprawić. Ale nie jest jasne, czy i kiedy to nastąpi.

+0

Jestem na Hibernate 3.6.0. Kiedy próbuję postępować zgodnie z przykładem, pojawia się błąd "kolumna indeksu zerowego dla kolekcji". Problem z jirą mówi, że jest na 3.5.3 i że nie zostanie to naprawione, więc nie sądzę, że jest to błąd, który został naprawiony w 3.6. Komentarz do błędu mówi, że to, co jest pokazane dla błędu, jest nieważne, ale to, co pokazano w dokumentacji, jest podobne, ale ważne. – Mark

+0

Wygląda na to, że jest to błąd związany z dokumentacją i nadal nie jest obsługiwany. Zobacz moją aktualizację. –

+0

Dzięki. Wydaje się, że możliwe jest osiągnięcie tego samego na przykładach: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-extratype-indexbidir – Mark

2

zrobić coś takiego:

@Entity 
class Parent { 

    @OneToMany 
    @IndexColumn(name = "index_column") 
    List<Child> children; 
} 

@Entity 
class Child { 

    @ManyToOne 
    Parent parent; 
    @Column(name = "index_column") 
    Integer index; 

    @PrePersist 
    @PreUpdate 
    private void prepareIndex() { 
     if (parent != null) { 
      index = parent.children.indexOf(this); 
     } 
    } 
} 
3

Dla mnie chodziło, aby ustawić kolumny zadeklarowanej w @OrderColumn do NOT NULL i wartości domyślnej 0

+1

Byłem do 2 nad ranem próbując to zrozumieć. W dokumentacji * nie * podano, że kolumna zamówienia musi mieć wartość inną niż null. Ugh! –

+0

spowoduje to utworzenie duplikatów –

0

Może te mogą pomóc:

Mam ten sam problem ze starszą wersją hibernacji (3.5.6) z tagiem @IndexColumn i znajdę jedno dobre, nieinwazyjne obejście: spróbuj zmienić swoje List<Message> na Set<Message> Obiekt i użycie HashSet zamiast ArrayList. Wygląda na to, że stare wersje Hibernate działają lepiej z zestawami.

Powodzenia!

Powiązane problemy