2010-02-17 21 views
5

Czy to może mieć jakiś sens?Wywołanie jednego DAO z innego DAO?

Powiedz, że muszę pobrać obiekt z bazy danych, która ma związek z innym obiektem (reprezentowany przez klucz obcy w DB i przez kompozycję w obiekcie mojej domeny). Jeśli w moim pierwszym DAO pobieram dane dla obiektu 1, wówczas wywołaj dao dla obiektu 2, a na końcu (z wnętrza pierwszego DAO wywołaj obiekt ustawiający w obiekcie 1 i przekaż mu wcześniej pobrany obiekt 2).

Wiem, że mógłbym zamiast tego dokonać łączenia, ale wydaje mi się to bardziej logiczne, abym oddzielił funkcjonalność (dlatego sceptycznie podchodzę do jednego dao od drugiego). A może powinienem przenieść część logiki do warstwy usługi?

Dzięki

Aktualizuj: Myślę, I rozwiązać problem z pomocą odpowiedzi: wszystko, co potrzebne do zrobienia było dodać następujące do mojego mapowania Object 1:

<one-to-one name="Object2" fetch="join" 
     class="com...Object2"></one-to-one> 

Nie miałem "Trzeba zmienić cokolwiek innego. Dzięki za pomoc!

+0

powiedziałbym nie, wyjaśniłem w innym wątku http://stackoverflow.com/questions/8988252/can-a-dao-call -dao –

Odpowiedz

9

Czytając to mogę stwierdzić tylko, że najprawdopodobniej, robisz to źle ..;)

Jeśli konfiguracja mapowania prawo między ObjectA i objectB (może być OneToOne, OneToMany lub ManyToMany), Hibernate will (leniwy) ładuje referencje od A do B automatycznie. Spowoduje to wyeliminowanie potrzeby wysyłania zapytania do drugiego obiektu DAO i ustawiania obiektu ObjectB w ObjectA.

Zrób jeszcze jeden krok i nawet nie potrzebujesz DAO dla ObjectB!

+0

Dzięki ... to jest to, nad czym pracuję. Czy mogę prosić o przykład tego, jak wyglądałoby to mapowanie (nie mam szczęścia w Google). Ponadto, jeśli odwzorowania będą poprawne, czy nadal będę musiał określić "sprzężenie" w moim DAO? – oym

+0

@ es11: Widzę, że rozwiązałeś swój problem. Cieszę się, że mogę pomóc. Aby odpowiedzieć na pytanie: To, co masz, wydaje się wystarczające, więc nie, poza mapowaniem, nie będziesz musiał zadeklarować żadnego sprzężenia podczas pobierania swoich obiektów z DAO. – Tim

+0

100% zgodził się Tim! –

6

Osobiście wolę unikać odniesień między DAO. Gdybym potrzebował dane pobrane przez DAO do wykonania innej operacji I oddzielić te DAOs:

// Bad - have to inject Dao into antoher Dao 
class FooDao extends BaseDao { 
    BarDao barDao; 

    public Foo complexLoad() { 
    return doFooStuff(barDao.loadBar()); 
    } 
} 

// Good - dependency on Bar only, not to Dao 
class FooDao extends BaseDao { 
    public Foo complexLoad(Bar bar) { 
    return doFooStuff(bar); 
    } 
} 

Potem wstrzykiwać zarówno DAOs do służby.