2012-02-23 29 views
9

Tengo dos ejemplos que primero es el mapeo unidireccional @OneToOne y el segundo bidireccional. En el mapeo unidireccional, la tabla del lado propietario debe contener una columna de unión que haga referencia a la identificación de la otra tabla; luego, en bidireccional, ambos deben contener una columna de clave externa el uno para el otro. Pero después de generar el esquema de la base de datos con la estrategia de autogeneración, dos ejemplos tienen el mismo efecto en el esquema de la base de datos. El mapeo unidireccional es normal, pero el ejemplo bidireccional solo contiene una columna de clave externa, ¡pero debe implicar la clave externa de cada uno!@OneToOne unidireccional y bidireccional

Mapeo unidireccional

@Entity 
public class Customer43 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address43 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 

// Getters, Setters and Constructors. 
} 

bidireccional Mapeo

@Entity 
public class Customer44 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address44 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 
@OneToOne(mappedBy = "address") 
private Customer44 customer; 

// Getters, Setters and Constructors. 
} 

¿Por qué es la salida del esquema de base de la misma y por qué actúa el mapeo bidireccional como unidireccional?

Respuesta

19

Porque no entendió cómo se asigna un OneToOne bidireccional. No necesita dos claves externas. Uno solo es suficiente para realizar una unión entre ambas tablas, en las dos direcciones:

select a.* from address a inner join customer c on c.addressId = a.id; 
select c.* from customer c inner join address a on c.addressId = a.id; 

El hecho de que la asociación es unidireccional o bidireccional no cambia la forma en que las mesas están unidos entre sí. Simplemente cambia la asignación y permite navegar a través de la asociación en ambas direcciones.

En una asociación bidireccional, siempre tiene un lado propietario (que indica cómo se asocia la asociación, con qué columna de combinación), y un lado inverso, donde solo dice: Soy el otro lado de la asociación que está mapeado por este campo (el campo en el valor de atributo mappedBy) en la entidad objetivo.

+1

Entonces, ¿cuál es la ventaja o desventaja de ellos? –

+9

La ventaja de una asociación unidireccional es que es más fácil de administrar, ya que solo debe mantener un lado. La ventaja de una asociación bidireccional es que puede navegar en ambas direcciones (obtener la dirección de un cliente u obtener una dirección de cliente). –

+0

¿esto se aplica a OneToMany y ManyToOne? –

4

Acabo de tener un experimento sobre esto. Si solo hace esto a continuación, ambas tablas tendrán claves foráneas:

@OneToOne 
private Address43 address; 

@OneToOne 
private Customer44 customer; 

Ahora no necesita hacer la unión. No estoy seguro de si es una buena práctica o no. Solo asegúrate de no tener CASCADAS.

Cuestiones relacionadas