具有中间表和非主键的一对一映射

时间:2019-11-19 14:32:47

标签: java sql hibernate jpa hibernate-mapping

我有两个表,我想使用一个中间表将其与@OneToOne映射连接,我的问题是它没有与主键连接。

这是我的模式:

CREATE TABLE USERS
(
    USER_ID INT NOT NULL PRIMARY KEY,
    METADATA_ID INT NOT NULL,
    ...
);

CREATE TABLE USER_DETAILS
(
    USER_TYPE INT NOT NULL PRIMARY KEY,
    ..
);

CREATE TABLE USERS_METADATA
(
    ID INT NOT NULL PRIMARY KEY,
    USER_TYPE INT NOT NULL,
    ...
);

我希望我的User休眠Pojo看起来像这样:

@Entity
@Table(name = "USERS")
class User {
   @Id
   @Column(name = "USER_ID")
   private long userId;

   @OneToOne(fetch = FetchType.EAGER)
   @JoinTable(name = "USERS_METADATA",
      joinColumns = @JoinColumn(name = "ID", referencedColumnName = "USER_ID"),
      inverseJoinColumns = @JoinColumn(name = "USER_TYPE", referencedColumnName = "USER_TYPE"))
   private UserDetails userDetails;
}

@Entity
@Table(name = "USER_DETAILS")
class UserDetails {
    @Id
    @Column(name = "USER_TYPE")
    private long userType;
}

我试图使用@OneToOne将其映射为@JoinTable关联,但是由于并非所有涉及的列都是PK,因此失败了,由于历史原因,不能更改表。

我得到的错误是:

org.hibernate.AnnotationException: SecondaryTable JoinColumn cannot reference a non primary key

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

为一对一关系创建联接表有什么意义?要使用这种关系将两个表连接起来,唯一需要的是一个外键。

我建议在USERS的{​​{1}}表中创建一个ID:

USER_DETAILS

然后使用此列加入:

CREATE TABLE USER_DETAILS
(
    USER_TYPE INT NOT NULL PRIMARY KEY,
    USERS_ID REFERENCES USERS(USER_ID),
    ..
);