Java Hibernate annotation relacja many-to-many na wielu encjach

0

Witam wszystkich,

moja baza zawiera encje:
Firma, Telefon, Osoba

Firma - Telefon w relacji many-to-many (firma może mieć wiele numerów, pod jednym numerem mogą być 2 działalności gospodarcze)
oraz
Osoba-Telefon w relacji many-to-many (osoba może mieć wiele numerów, pod jednym numerem może być dostępnych kilka osób)

Klasy Firma i Osoba nie są w relacji dziedziczenia i obie dziedziczą tylko po Object.

W jaki sposób za pomocą adnotacji Hibernate stworzyć taką relacje?

Bardzo proszę o pomoc, jestem początkującym użytkownikiem Hibernate.

0

I nic a nic w internecie o tym nie znalazłeś? o_O
http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/

0

Dziękuję za link, właśnie z tego tutoriala korzystam. Powinienem sprecyzować moje pytanie. Czy taka konstrukcja jest poprawna?

Klasa Telefon:

 
@ManyToMany(mappedBy="telefony")
private Set<Firma> firmy = new HashSet<Firma>();

@ManyToMany(mappedBy="telefony")
private Set<Osoba> osoby = new HashSet<Osoba>();

Klasa Firma:

 
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="FIRMA_TELEFON", 
                joinColumns={@JoinColumn(name="FIRMA_ID")}, 
                inverseJoinColumns={@JoinColumn(name="TELEFON_ID")})
 private Set<Telefon> telefony = new HashSet<Telefon>();

Klasa Osoba:

 
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="OSOBA_TELEFON", 
                joinColumns={@JoinColumn(name="OSOBA_ID")}, 
                inverseJoinColumns={@JoinColumn(name="TELEFON_ID")})
 private Set<Telefon> telefony = new HashSet<Telefon>();

Moje drugie pytanie, dotyczy kolekcji po stronie klasy Telefon - ten set z Firmami i Osobami nie jest mi potrzebny. Czy mogę zrobić takie mapowanie, nie definiując w klasie Telefon żadnej kolekcji?

0
  1. Sprawdź czy jest poprawne ;] Po prostu uruchom.
  2. Trochę dziwne pytanie. Jak nie zdefiniujesz kolekcji po stronie Telefon to to będzie zwykłe właściwie ManyToOne bo przecież z poziomu telefonu nie będziesz miał dostępu do Firm ani do Osób więc będziesz miał tylko wskazanie że Firma może wiele numerów telefonu. Po co w takim razie w ogóle bawić się w ManyToMany?
0

Wszystko mogę sprawdzić sam, nie pytając na forum. Ale w praktyce dostaję tak wiele błędów, że przynajmniej co do podstawowych rzeczy wolałbym mieć pewność, że dobrze je robię. Stąd moje naiwne pytanie:)

Może źle rozumiem działanie Hibernate. Nie chcę z każdym obiektem Telefon dostawać kilku kolekcji firm, osób i innych podmiotów posiadających ten telefon. Chcę otrzymać taką listę tylko na moje wyraźne zapytanie i to z ograniczeniem co do ilości wyników i ofsetem.
Dlaczego?
Po pierwsze z powodu wydajności. Jeśli zamiast telefonu to będzie województwo (też w relacji many-to-many, lub one-to-many) za każdym razem kiedy wczytam "Śląskie" żeby sprawdzić np. średni dochód na mieszkańca, dostanę również kolekcję kilkudziesięciu tysięcy firm, która akurat nie jest potrzebna.
Po drugie ze względu na elegancję kodu, wolałbym żeby klasa Telefon czy Wojewodztwo nie wiedziala gdzie i do czego jest używana. Jeśli kiedys dopiszę klasę (i encję) Fundacja, która używa telefonów i województw, nie chcę dodawać specjalnych kolekcji w klasach Telefon/Wojewodztwo.

0

Ale jedno z drugim niewiele ma wspólnego. Możesz sobie zwyczajnie zrobić fetch na Lazy i wtedy pobranie telefonu nie pobierze ci od razu wszystkiego z czym ten telefon jest powiązany ;) A potem w HQLu zrobić sobie zapytanie które robi joina z odpowiednimi warunkami i wtedy jak użyjesz tego zapytania (czyli wywołasz odpowiednią metodę z DAO) to wyciągnie ci to co potrzebujesz.

0

Dziekuję za wskazówki, nie wiedziałem o takiej możliwości:
Klasa Telefon:

 
@ManyToMany(fetch = FetchType.LAZY, mappedBy="telefony")
private Set<Firma> firmy = new HashSet<Firma>();

a w przypadku relacji many-to-one/one-to-many można też użyć jednostronego mapowania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1