2012-06-14 16 views
6

Tôi có hai bảng:Hibernate OneToOne tham gia với duy nhất nhưng không chính chủ chốt

  1. người dùng:

    • user_id (tiểu học)

    • vv ..

  2. users_info

    • id (tiểu học)

    • user_id (unique)

    • vv ..

Tôi muốn tạo ra một oneToOne mối quan hệ từ user đến user_info trên trường user_id. Lưu ý rằng nó là duy nhất nhưng không phải là chính. Nó có thể được thực hiện trên Hibernate? Những gì tôi đang làm, Hibernate cố gắng sử dụng trường users_info.id thay vì trường u sers_info.user_id.

@OneToOne(mappedBy="user_id", cascade = {CascadeType.ALL}, fetch=FetchType.LAZY, optional=true) 
@JoinColumn (name="user_id")  
public UserInfo getUserInfo() { return userInfo; } 
public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } 
private UserInfo userInfo; 

Trả lời

2

Tại sao bạn muốn khóa "duy nhất" là ánh xạ 1-1 và ID thay thế? Nó dư thừa. Chỉ cần làm cho hai PK bằng nhau vì nó là một bản đồ 1-1.

+0

trong khi tôi đồng ý với bạn Tôi đã có một khách hàng ra lệnh 'yêu cầu này' cho tôi và phải thực hiện nó. Vâng tôi vẫn thức dậy trong mồ hôi lạnh về nó .... – Namphibian

0

Có, thao tác này sẽ hoạt động. Trong một-một hoặc nhiều-một, bạn có một khóa chính trong bảng đầu tiên và khóa ngoài trong bảng thứ hai.

0

Ánh xạ sẽ hoạt động như bạn đã xác định cột bảng để tham gia. Nhưng chỉ một điều tôi không chắc chắn khi bạn định nghĩa tất cả các chú thích trên phương thức getter, vì vậy nó sẽ hoạt động theo cách tương tự.

2

Trong User bạn nên có:

@OneToOne(mappedBy="user", cascade = CascadeType.ALL, fetch=FetchType.LAZY, optional=true) 
public UserInfo getUserInfo() { return userInfo; } 

Và trong UserInfo:

@OneToOne 
@JoinColumn(name="user_id") 
public User getUser() { return user; } 

Có một cái nhìn here. Đây là ví dụ thứ hai về ánh xạ một đối một.