当前位置: 首页 > 知识库问答 >
问题:

HIbernate不会为@OneToOne创建外键

经佐
2023-03-14

我有两张桌子:

@Entity
public class TestEntity {

    @Id
    @Column(name = "id")
    private UUID id;

    @OneToOne(targetEntity = InfoEntity.class, cascade = CascadeType.ALL)
    @JoinColumn(name="id", referencedColumnName = "id")
    private InfoEntity info;

    ...
}
@Entity
public class InfoEntity {
    @Id
    @Column(name = "id")
    private UUID id;

    @OneToOne(mappedBy = "info")
    private TestEntity test;
    
    ...
}

基本上,我想通过id字段定义一个从TestEntityInfoEntity的外键,这两个表中的字段是相同的。问题是,当我在IntelliJ Idea中检查数据库时,我在Keys部分没有看到任何外键(检查了两个表),只有它们的PK。这段代码有问题吗?我已经按照另一个类似问题中的建议设置了属性:

  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect

共有1个答案

毕宇
2023-03-14

问题是,JoinColumn中的名称具有值id。请将其更改为info_id,例如:

@OneToOne(targetEntity = InfoEntity.class, cascade = CascadeType.ALL)
@JoinColumn(name="info_id", referencedColumnName = "id")
private InfoEntity info;

您的TestEntity已经有一个列id,所以它必须有另一个名称。

 类似资料:
  • 我现在对hibernate有一个很奇怪的问题。在一个表上,它创建了一个引用它自己的外键。该列也是主键。这基本上阻止了我从表中删除任何行。 在日志中我可以看到一行字:

  • 我的数据库技能有点生疏,所以对我来说学习Hibernate有点难。 我一直在阅读一对一、一对多和多对多,简而言之,这是我年轻时的理解: 一对一:-表A链接到表B中的另一行,表A中的行数必须等于表B中的行数。 一对多:-每家公司可以有很多员工。 多对多:-许多医生可以拥有/分享不同的病人。(无意双关语)。 假设我有以下表格,对于殡仪员客户模型 [id[pk]、全名(char)、年龄(int)、地址(

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 我有带有Hibernate和Spring框架的Maven项目。我希望Hibernate自动创建表,但是只是删除所有现有表,并且不创建所需的表。在会话工厂初始化期间不会引发任何异常,但是当我

  • 我有一个这样的实体: 多谢了,安德里亚

  • 问题内容: 在这里记录此信息是因为我只花了一个小时试图解决这个问题。 我有一个实体Foo,拥有: Hibernate为什么不在foo.bar-> bar.id上创建外键约束? 问题答案: 这是因为MySQL在使用ENGINE = MyISAM创建的表上不支持外键约束。您需要使用ENGINE = InnoDB创建(均为!)表。您可以通过调整,添加默认值或在JDBC URL中使用特殊变量来执行此操作:

  • 问题内容: 它是有效申报,并在关系的双方,如: 我找不到任何表明这是无效的信息,但似乎在持久性过程中,至少必须违反关系的一侧。(例如,如果首先写入changeEntry,则changeEntryDetails临时为null)。 尝试此操作时,我看到抛出了异常。 我想避免在可能的情况下放宽约束,因为双方都 必须 存在。 问题答案: 声明并在关系的两边是否合法(…)我找不到任何表明无效的内容,但是在持