JPA - relacje dwustronne

szukaj na forum nowy temat odpowiedz

Strona [ 1 ] z 1

walec 51 ten post 10-03-2010 14:13





Witam.

Tak się bawię z JPA na Hibernate i zastanawia mnie pewna kwestia. Mam dwie klasy:

<java>
@Entity
public class Tavern {

    @Id
    @GeneratedValue
    private Integer Id;
    private String name;
    @OneToMany(mappedBy="tavern")
    private List<TavernRoom> rooms;
    @OneToOne
    private TavernRoom defaultRoom;

    //sety i gety
}

@Entity
public class TavernRoom {

    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    @ManyToOne
    private Tavern tavern;
    @OneToMany(mappedBy="location")
    private List<Player> players;

    //sety i gety
}
</java>

i teraz interesuje mnie relacja Tavern.rooms <-> TavernRoom.tavern

Zastanawia mnie czy aby zainicjalizować tą relację muszę zawszę robić:

<java>
someTavern.getRooms().add(someRoom);
someRoom.setTavern(someTavern);
</java>

Czy nie powinno wystarczyć ustawienie tylko jednego z dwóch ? kwestia konfiguracji ?

Przejdź na górę strony
cytuj
:: ten post 10-03-2010 15:12





Musisz tak robic, ale tylko wtedy jesli zalezy Ci zeby model obiektowy byl spojny zaraz po utworzeniu. Jak nie zrobisz tego dwustronnie, musisz przynajmniej ustawic pole ktore zarzadza relacja (w tym przypadku to TavernRoom.tavern), zapisac do bazy, zapomniec o tych referencjach, i wczytac z bazy - dostaniesz spojny model obiektowy. Polecam ksiazke Java Persistence with Hibernate, jest tak troche na ten temat.
Automatyczne zarzadzanie bylo w CMP <= 2.1 (Entity Beans), a jak sie ludziom to i inne wynalazki podobaly to wiemy.
Mowimy tutaj o API JPA, podobno niektorzy providerzy takie cos wspieraja, ale Hibernate chyba nie, a przynajmniej nie widzialem nigdy nic na ten temat.
Jak ja to rozwiazuje to tak ze mam metode np Tavern.addTavernRoom() ktora dodaje sobie do kolekcji i rowniez ustawia TavernRoom.tavern, i podobnie do usuwania. Trzeba uniknac zapetlenia. Zazwyczaj robie tak ze ktoras z tych metod bylaby package private i po prostu nie wolalaby tej drugiej, unikajac petli. Package private dlatego zeby nie byla dostepna w publicznym API, a zatem nie mozna jej wywolac i myslec ze sie ma spojny model, i w rzeczywistosci nie miec. Troche inne a troche podobne :D podejscie tutaj:
http://blog.xebia.com/2009/03/[...]rns-bidirectional-assocations/
Przejdź na górę strony
cytuj
walec 51 ten post 10-03-2010 20:58





Ok. Dzięki za info
Przejdź na górę strony
cytuj
szukaj na forum nowy temat odpowiedz

Strona [ 1 ] z 1

1 użytkownik(ów) przegląda ten temat (1 gości)
(żadnych zarejestrowanych użytkowników)

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0174 sek. (zapytań SQL: 9)