2014-01-30 81 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'方案。 –