2012-05-08 11 views
7
@Entity 
public class Troop { 
    @OneToMany(mappedBy="troop") 
    public Set<Soldier> getSoldiers() { 
    ... 
} 

@Entity 
public class Soldier { 
    @ManyToOne 
    @JoinColumn(name="troop_fk") 
    public Troop getTroop() { 
    ... 
}  

walczę z dokumentacją na ten temat:Co oznacza właściciel relacji w trybie hibernacji?

Troop has a bidirectional one to many relationship with Soldier through the troop property. You don't have to (must not) define any physical mapping in the mappedBy side. 

Tak na przykład następujący kod:

Troup t = new Troup(); 
t.getSoldiers().add(soldier); 

Co różnica będzie, jeśli po prostu nazywa session.saveOrUpdate(t), a jeśli po prostu nazywa session.saveOrUpdate(s)? MappedBy definiuje grupę jako właściciela, ale co konkretnie to oznacza? Ponieważ spodziewam się, że jeśli zapiszę obiekt żołnierza, z pewnością kolumna troop_fk zostanie zapisana poprawnie? A jeśli po prostu zapiszę obiekt grupy, z pewnością klucz obcy żołnierza będzie nadal poprawnie aktualizowany podczas kaskadowania? Naprawdę nie widzę różnicy.

Odpowiedz

4

Właściciel to podmiot, który ustawia klucz obcy w bazie danych podczas płukania.

kod:

Troup t = new Troup(); 
t.getSoldiers().add(soldier); 
session.SaveOrUpdate(t); 
session.Flush(); 

bez kaskadowych:

throws references transient instances 

z kaskadowych i właściciel = oddziału

INSERT INTO troops (id, ...) VALUES (1, ...) 
INSERT INTO soldiers (..., troop_fk) VALUES (..., NULL) 
UPDATE soldiers SET troop_fk=1 <- troop sets its key 

z kaskadowych i właściciel = żołnierza

INSERT INTO troops (id, ...) VALUES (1, ...) 
INSERT INTO soldiers (..., troop_fk) VALUES (..., 1) <- soldier saves the reference 
+0

Aby uzyskać więcej informacji, sprawdź rozdział 2.2.5.3.1.1. na http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-association. Informacje na temat przełączania prawa własności z jednego podmiotu na inny w powyższym przykładzie. –

+0

z kaskadowaniem i owner = troop, INSERT INTO soldiers (..., troop_fk) VALUES (..., NULL). Jeśli w tabeli żołnierzy toop_fk nie jest zerowany, to podczas wykonywania zapytania hibernuje błąd thows. Czy to deweloper musi się tym zająć? –

+0

jeśli kolumna nie jest pusta, po prostu nie można użyć "kaskadowanie i właściciel = oddział" – Firo