具有中间 Table 和非主键的 OneToOne 映射
OneToOne Mapping with Intermediate Table and Non Primary Keys
我有两个 table 我想使用中间 table 与 @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,由于历史原因 tables 不能改变了。
我得到的错误是:
org.hibernate.AnnotationException: SecondaryTable JoinColumn cannot reference a non primary key
有什么建议吗?
为一对一关系创建连接 table 有什么意义?使用此关系连接两个 table 唯一需要的是单个外键。
我建议在 USER_DETAILS
:
中为 USERS
table 创建一个 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;
我有两个 table 我想使用中间 table 与 @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,由于历史原因 tables 不能改变了。
我得到的错误是:
org.hibernate.AnnotationException: SecondaryTable JoinColumn cannot reference a non primary key
有什么建议吗?
为一对一关系创建连接 table 有什么意义?使用此关系连接两个 table 唯一需要的是单个外键。
我建议在 USER_DETAILS
:
USERS
table 创建一个 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;