JPA - relacje dwustronne

0

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 ?

0

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/16/jpa-implementation-patterns-bidirectional-assocations/

0

Ok. Dzięki za info

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