2014-01-30 82 views
1

假設你有一個表,如下所示:映射按鍵在JPA:主鍵是一個外鍵

CREATE TABLE IF NOT EXISTS CREDENTIAL (
    USER_NAME  VARCHAR(20) NOT NULL, 
    HASHED_PASSWORD VARCHAR(128) NOT NULL, 
    CREATION_DATE  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    LAST_UPDATE_DATE TIMESTAMP, 
    LAST_UPDATED_BY VARCHAR(20), 

    PRIMARY KEY (USER_NAME), 
    FOREIGN KEY (USER_NAME) REFERENCES USER(USER_NAME), 
    FOREIGN KEY (LAST_UPDATED_BY) REFERENCES USER(USER_NAME) 
) CHARACTER SET utf8; 

人們可以看到,USER_NAME列是主鍵表,以及一個外鍵。是的,MySQL成功生成了這張表。

問題很簡單,我如何將這個映射到JPA實體?我是否應該有一個映射到USER_NAME列的ID和另一個加入USER_NAME列的字段User user?歡迎提出建議。

回答

2

簡單的解決辦法是:從自己的經驗

@Entity 
public class Credential { 

    @Id 
    private String userName; 

    @ManyToOne 
    @JoinColumn(name = "user_name") 
    private User owner; 

    @ManyToOne 
    @JoinColumn(name = "last_modified_by") 
    private User lastUpdatedBy; 


} 

注:

我會建議創建數字類型(從DB的角度有益)的surrogate primary key。您可以通過數據庫約束強制用戶名的唯一性。

+0

爲什麼使用'@ ManyToOne'?一個用戶擁有一個憑證,因此爲什麼'USER_NAME'是主鍵。 –

+0

ManyToOne更容易處理。事實上,你可以與OneToOne一起生活,但我發現OneToOne更難以管理。另外如果應用程序有幾種認證用戶的方式呢? – WeMakeSoftware

+0

它有,但其他認證方案是通過各自的第三方認證完成的,所以不需要將其映射到'@ ManyToOne'方案。 –