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 (?)
我有 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 (?)