【问题标题】:OneToOne Mapping with Intermediate Table and Non Primary Keys具有中间表和非主键的 OneToOne 映射
【发布时间】:2020-03-15 02:39:01
【问题描述】:

我有两个表,我想使用中间表加入 @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

有什么建议吗?

【问题讨论】:

  • 你用的是什么休眠版本?
  • 我尝试在 hibernate 5.4.4 中使用你的映射并且它有效。

标签: java sql hibernate jpa hibernate-mapping


【解决方案1】:

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

我建议在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;

【讨论】:

  • 是的,这可行,但这是我尽量避免的。
  • @Shvalb 但为什么呢?这就是它通常的设计方式,比连接表更有效。你所做的是一个反模式。
  • 谢谢!我会为此重新考虑我的设计。
  • @Shvalb 没问题,如果您觉得这个答案有帮助,请考虑点赞;>
猜你喜欢
  • 2020-03-18
  • 2010-10-14
  • 2014-10-12
  • 2015-08-24
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2010-09-23
相关资源
最近更新 更多