Jpa OneToOne 共享主键成功了一半

Jpa OneToOne shared primary key half works

我有 SpringBoot 2.1.3 和 Java 8 应用程序。使用 JPA 构建数据库 我有 3 个 table 一对一关系。假设 tables 如下:

@Entity
@Data //lombok
@Table(name = "users")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Long id;

  @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
  private Address address;
}

然后:

@Entity
@Data
@Table(name = "address")
public class Address {
  @Id
  @Column(name = "id")
  private Long id;

  @OneToOne
  @MapsId
  private User user;
}

行得通..而且这是最好的方法(这个例子完全来自文档)。

如果我启动应用程序,则会创建数据库,如果我尝试添加实体,一切都会正常进行。创建的模型如下:

现在我想将一个国家/地区对象添加到我的地址实体(例如),我修改了实体如下:

@Entity
@Data
@Table(name = "address")
public class Address {
 @Id
 @Column(name = "id")
 private Long id;

 @OneToOne
 @MapsId
 private User user;

 @OneToOne
 @MapsId
 private Country country;
}

和国家实体:

@Entity
@Data 
@Table(name = "country")
public class Country {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Long id;

  @OneToOne(mappedBy = "country", cascade = CascadeType.ALL)
  private Address address;
}

应用程序仍然启动,数据库已创建,模型如下:

但是如果我尝试按如下方式保存用户:

User user = new User();
Address address = new Address();
Country country = new Country();

user.setAddress(address);
address.setUser(user);

address.setCountry(country);
country.setAddress(address);

userRepository.save(user);

我得到错误:

java.sql.SQLException: Field 'country_id' doesn't have a default value

无论如何,我解决了删除@MapsId 和添加@JoinColumn 的问题,但我想了解问题所在。

P.S.: 我正在使用 MySQL 5.7 和 InnoDB 方言(在 application.properties 上设置)

谢谢大家

它仅适用于一个 @MapsId 注释。使用两个导致未插入国家/地区 ID:

insert into Country (id) values (?)
insert into Users (id) values (?)
insert into Address (user_id) values (?)