2012-02-23 48 views
9

Tôi có hai ví dụ đầu tiên là @OneToOne ánh xạ một chiều và hai chiều hai chiều. Trong ánh xạ một chiều, bảng bên sở hữu phải chứa cột nối tham chiếu đến id của bảng khác; sau đó trong hai chiều, cả hai phải chứa một cột khoá ngoại cho nhau. Nhưng sau khi tạo lược đồ cơ sở dữ liệu với chiến lược autogenerate, hai ví dụ có cùng tác dụng trên lược đồ cơ sở dữ liệu. Ánh xạ một chiều là bình thường nhưng ví dụ hai chiều chỉ chứa một cột khóa ngoài, nhưng nó phải liên quan đến khoá ngoại của nhau!@OneToOne một chiều và hai chiều

Unidirectional Mapping

@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. 
} 

hai chiều Mapping

@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. 
} 

Tại sao là sản phẩm đồ cơ sở dữ liệu giống nhau và tại sao lập bản đồ hành hai chiều như một chiều?

Trả lời

19

Vì bạn không hiểu cách OneToOne hai chiều được ánh xạ. Bạn không cần hai khóa ngoại. Một trong những đơn là đủ để thực hiện một tham gia giữa hai bảng, trong cả hai hướng:

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; 

Thực tế là hiệp hội là một chiều hoặc hai chiều không thay đổi cách các bảng được liên kết với nhau. Nó chỉ thay đổi ánh xạ và cho phép điều hướng thông qua liên kết theo cả hai hướng.

Trong liên kết hai chiều, bạn luôn có một bên sở hữu (cho biết cách liên kết được ánh xạ, sử dụng cột nối) và mặt ngược, nơi bạn vừa nói: Tôi là bên kia của liên kết được ánh xạ bởi trường này (trường trong giá trị thuộc tính mappedBy) trong thực thể đích.

+1

Vì vậy, lợi thế hoặc bất lợi của chúng là gì? –

+9

Lợi thế của một hiệp hội một chiều là dễ quản lý hơn, bởi vì bạn chỉ phải duy trì một bên. Lợi thế của một hiệp hội hai chiều là bạn có thể điều hướng nó theo cả hai hướng (lấy địa chỉ của khách hàng hoặc nhận được khách hàng của một địa chỉ). –

+0

điều này có áp dụng cho OneToMany và ManyToOne không? –

4

Tôi vừa có một thử nghiệm về điều này. Nếu bạn chỉ làm điều này bên dưới, cả hai bảng sẽ có khóa ngoài:

@OneToOne 
private Address43 address; 

@OneToOne 
private Customer44 customer; 

Bây giờ bạn không cần phải tham gia. Tôi không chắc đó có phải là một thực hành tốt hay không. Chỉ cần chắc chắn rằng nếu bạn không có CASCADES.

Các vấn đề liên quan