2011-12-20 2 views
0

В упрощенной ситуации, как этот, с 3-х классов:Hibernate аннотации N ---- N отношений с ассоциированными данными в отношении

class ClassONE{ 

    protected List<IntermediatedClass>; 

    (... getters/setters) 

} 

class ClassTWO 

protected String someData; 

(... getters/setters/iniciate List etc...) 

} 

class IntermediatedClass{ 

public ClassONE one; //Points to an object (row) of ClassONE 
public ClassTWO two; //Points to an object (row) of classTWO. 
public Double data; //Data that need being saved with this particular relation between obj1 and obj2. 

} 

Я знаю, что с Hibernate вы можете объявить ManyToMany мононаправленных отношения между class1 и class2. Класс1 может иметь некоторые объекты класса2, а class2 может быть на некоторых объектах класса 1. Это просто [CLASS1] N ---- N [CLASS2].

Я хочу объявить обычную реализацию базы данных N-N [CLASS1] 1 --- N [INTERMEDIATECLASS] N --- 1 [CLASS2]. Промежуточный класс имеет атрибут очень важный: данные, тип Double. Я не могу найти способ объявить IntermediateClass своим способом реализовать этот N - N с этими данными в Hibernate Annotations.

Любая помощь, пожалуйста? Просто с этим простым примером я могу решить свою проблему. Я не сделал бы свои попытки на этом, чтобы поддерживать чистый код для вашего понимания.

ответ

2

Вы можете создать полномасштабную двунаправленной многие-ко-многим картирование с промежуточным классом отображения с дополнительными свойствами так же, как вы бы спроектировать модель ER:

class A { 
    private List<AB> ab; 

    @OneToMany(mappedBy = "a") 
    public List<AB> getAb() {...} 
} 

class B { 
    private List<AB> ab; 

    @OneToMany(mappedBy = "b") 
    public List<AB> getAb() {...} 
} 

и класс отображения:

class AB { 
    private A a; 
    private B b; 
    private double data; 

    @ManyToOne 
    @JoinColumn 
    public A getA() {...} 

    @ManyToOne 
    @JoinColumn  
    public B getB() {...} 

    @Column 
    public double getData() {...} 
} 

Но поскольку двунаправленные ассоциации, подобные этому, могут быть довольно беспорядочными и сложными для поддержания в коде приложения, я бы обошёл без двунаправленной ассоциации и просто определил две однонаправленные ассоциации «один-два» в классе AB.

+0

Я постараюсь с целым рядом концентрированных классов класса AB. Просто вопрос: почему вы определили аннотации выше метода геттера, а не над атрибутами? Я видел, что в документации Hibernate они так делают, и я объявляю аннотации над атрибутами. Некоторые советы по этому поводу? – Raph

+1

Вы можете определять аннотации либо по полям, либо по геттерам, это зависит от вас. Но я думаю, вы должны придерживаться одного или другого соглашения в иерархии классов. Если вы определяете аннотацию '@ Id' в поле, вы должны определить все аннотации в полях. Если вы определяете '@ Id' на геттере, это все геттеры. Также имейте в виду, что вам нужен сеттер (который может быть закрыт, хотя), если вы аннотируете геттеры. Только если вы добавляете '@AccessType (" field ")' в getter, то вам не нужен сеттер. – tscho

+0

Вкратце, я должен вручную определить [A] 1 --- N [AB] N --- 1 [B] с аннотациями в классе AB. Да, это лучший способ. Я думал, что мне удалось определить всю эту структуру в наборе параметров @ManyToMany. спасибо – Raph

Смежные вопросы