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

JPA hibernate中一对一关系中的外键约束

赵智
2023-03-14

无法添加或更新子行:外键约束失败(mydb.a,约束FK_77PKRKRIN5NQSX16B6NW6K9R7外键(ID)引用B(B_ID))

@JsonInclude(JsonInclude.Include.NON_NULL)     
@JsonIgnoreProperties(ignoreUnknown = true, value={"hibernateLazyInitializer", "handler"})
@Generated("org.jsonschema2pojo")
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
public class A {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @JsonIgnore
  private Integer id;

  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
  @PrimaryKeyJoinColumn(referencedColumnName="AId")
  @JsonIgnore
  private B b;

}

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler"})
@Generated("org.jsonschema2pojo")
@Entity
public class B {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int bId;

  @OneToOne()
  @JsonIgnore
  private A a;

}

如果我删除optional=false,insert操作将会很好地工作。在将对象插入数据库之前,我检查了这些对象,并确保A包含BB包含A

用于创建AB的SQL脚本为:

Hibernate:创建表b(b_id integer not null auto_increment,string_results longtext,a_id integer,主键(b_id))

Hibernate:创建表a(id integer not null auto_increment,主键(id))

Hibernate:alter表b添加约束FK_o3oen721etlltdc7ls82524nh外键(detail_id)引用a(id)

Hibernate:alter表a添加约束FK_77pkrkrin5nqsx16b6nw6k9r7外键(id)引用b(b_id)

共有1个答案

冯沛
2023-03-14

当我看到下面这句话:

在将对象插入DB之前,我检查了对象,并确保A包含B,B包含A。

我猜你想要建立一个双向一对一的关系。如果是这样,您当前的映射就不能像预期的那样工作。让我们看看JPA2.0规范(下载链接)对此作了什么说明,以理解这一问题:

•一对多/多对一双向关系的多侧必须是拥有方,因此不能在ManyToOne注释上指定mappedBy元素。

•对于一对一的双向关系,拥有方与包含相应外键的方相对应。

•对于多对多双向关系,任何一方都可能是拥有方。

@Entity
public class A {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Integer id;

   @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
   @JoinColumn(name="b_id", referencedColumnName="ID")
   private B b;

}

@Entity
public class B {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @OneToOne(mappedBy = "b")
    private A a;

}
create table a (id integer not null auto_increment,
                b_id integer not null,
                primary key (id),
                foreign key b_id references b (id));

create table b (id integer not null auto_increment, 
                string_results longtext, 
                primary key (id));

注:

>

  • 我删除了特定于JSON的注释,以使代码更短(我对它们没有任何了解)

    如果要使实体b成为拥有方,则必须相应地调整关系映射。

  •  类似资料:
    • 我有两个实体。我想在持久化所有者实体时级联插入子实体,并将子实体的SSO_ID设置为生成器为所有者生成的实体。 ID类是: 相反,我得到了一个错误: 插入hub_users_emails(user_sso_idemail_typesso_idstart_dateuser_mail)值 (?, ?, ?, ?, ?) (等) 绑定参数[1]as[BIGINT]-[1234837655]= (等) 将

    • 用户表: 图书目录: 用户模型中的关系: 默认情况下,外键指向主键id。如何使其指向唯一的? 如果只有,是主键,我们可以用第三个参数传递它,并覆盖属性:

    • 问题内容: 我有两个非常简单的对象,并且一个对象应在一组“一对多”关系中包含另一个对象。对象已正确插入数据库中,但“子项”表中的外键始终为“ null”。 我不知道为什么: 这是测试对象,它将子对象保持在其集合中: 这是子对象,它包含指向“ TestObj”的反向链接: 我使用以下代码来持久化此对象: 有人可以解释一下为什么会这样吗? 问题答案: 这很简单:您永远不会初始化中的字段(应将其命名为C

    • 我使用的是PlayFramework 2.3,我有以下类: MyEntity.java: Version.java 当我想为实体创建一个新版本时,我通过分离复制它,将id设置为0,并按如下方式持久化: 如果我使用下面的代码,它工作正常(第一个代码) 我不太喜欢这个代码,因为我可以像这样使用它(第二个代码) 但如果我这样做,外键不会在“实体”表中更新,我不知道为什么。有人能告诉我克隆的两种实现方式有

    • 我在项目中有一对一外键关系映射的问题。 User.java 角色Java语言 这是错误: 导致原因:lass.validateMappingException:无法确定类型:lass.java:265角色,在表:用户,对于列:[inal.jar列(ro)]在org.hibernate.boot.internal.SimpleVmpl.validate类型(SimpleVmpl.java:329)~

    • 无论B表中是否有匹配的记录,左外连接都应该从左表中获取所有数据,但如果左表的right_id列为空,则不能获取记录。 我在解释更多 我发现了这个, HQL支持两种形式的关联连接:隐式和显式。 上一节中显示的查询都使用显式形式,即在from子句中显式使用join关键字。这是推荐的表格。