java - 中间表和非主键的一对一映射

标签 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 Hibernate 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;
}

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

我收到的错误是:

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

有什么建议吗?

最佳答案

为一对一关系创建联接表有什么意义?使用此关系连接两个表所需的唯一事情是单个外键。

我建议在 USER_DETAILS 中为 USERS 表创建一个 id:

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

然后使用此列加入:

@OneToOne
@JoinColumn(name="USERS_ID")
private UserDetails userDetails;

关于java - 中间表和非主键的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58936379/

相关文章:

sql - 选择最近 7 天的行的最佳方式是什么?

spring - org.postgresql.util.PSQLException : ERROR: relation "dish" does not exist

java - 在 JDBC 中使用日历对象

sql - 使用 Postgres 聚合函数选择每个 GROUP BY 组中的第一行?

Java Firebase-Admin 缺少 GoogleCredentials

sql - 在特定列上交叉选择语句

java - 如何在不陷入无限反序列化循环的情况下反序列化与渴望双方的一对多关系

javascript - 将字符串插入 Ag-Grid

javascript - 在 java 项目中调用 node js 应用程序

java - 仅执行从 svn 到 maven 3 的最新代码更新