2012-05-08 7 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() { 
    ... 
}  

estoy luchando con documentación sobre esto:¿Qué significa un propietario de relación en Hibernate?

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. 

Así por ejemplo el siguiente código:

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

¿Cuál sería la diferencia si yo acaba de llamar session.saveOrUpdate(t), y si me acaba de llamar session.saveOrUpdate(s)? MappedBy define troup como el propietario, pero ¿qué significa específicamente esto? Porque esperaría que si guardo el objeto soldado, seguramente la columna troop_fk se guardará correctamente? Y si solo guardo el objeto troup, ¿seguramente la clave foránea del soldado se actualizará correctamente cuando esté en cascada? Realmente no puedo ver la diferencia.

Respuesta

4

el propietario es la entidad que establece la clave externa en la base de datos en el lavado.

el código:

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

sin conexión en cascada:

throws references transient instances 

con cascada y propietario de tropas =

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

con cascada y propietario = soldado

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

Para más información, consulte la sección 2.2.5.3.1.1. en http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-association. Con información sobre cómo alternar la propiedad de una entidad a otra para el ejemplo anterior. –

+0

con cascading y owner = troop, INSERT INTO soldiers (..., troop_fk) VALUES (..., NULL). Si en la tabla de soldados toop_fk no puede contener nulos, al ejecutar la consulta se hiberna el error de los jugadores. ¿El desarrollador tiene que encargarse de eso? –

+0

si la columna no es nulable, simplemente no puede usar "cascading and owner = troop" – Firo

Cuestiones relacionadas