java - 具有中间表和非主键的 OneToOne 映射
问题描述
我有两个表,我想使用中间表加入 @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;
}
我试图@OneToOne
使用 a 将其映射为关联@JoinTable
,但它失败了,因为并非所有涉及的列都是 PK,由于历史原因,无法更改表。
我得到的错误是:
org.hibernate.AnnotationException: SecondaryTable JoinColumn cannot reference a non primary key
有什么建议么?
解决方案
为一对一关系创建连接表有什么意义?使用这种关系连接两个表唯一需要的是一个外键。
我建议创建一个 id 到USERS
表中USER_DETAILS
:
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;
推荐阅读
- android - ContentResolver AndroidX IllegalArgumentException 无法为数据库提供空上下文
- security - 如何使用堆栈缓冲区溢出进行攻击
- c# - 简单/标量类型字符串参数的 FluentValidation
- android - 如何在 RxAndroid2 中组合 2 条代码链?
- css - 如何定位第一个孩子的第一个孩子
- android - 如何限制 ExposedDropdownMenu 在 AutocompleteTextViw 中输入文本
- python - 我怎样才能使这个python脚本连续/一遍又一遍地运行
- python - 在 python 中读取一个巨大的 xyz 文件(200M 行,~15 GB)并对其执行计算
- laravel - Laravel Echo / Socket.io 在睡眠后保持连接活跃
- r - 在多个循环中循环遍历 R 中文件夹中的所有文件