java - Spring数据JPA一对多/多对一不在数据库中插入/更新细节
问题描述
我正在为一对多做一项小型的教学和地址关系活动,在地址块中,国家、地区、tahasil 等之间将存在一对一的关系。每当我点击 api 并保存它时,它不会在地址表中更新或插入地址. 细节是
@Entity
@Table(name = "teachers")
@PrimaryKeyJoinColumn(name = "user_id")
public class Teacher extends User {
@Size(min = 3, max = 50)
@Column(name = "first_name")
private String firstName;
@Size(min = 3, max = 50)
@Column(name = "middle_name")
private String middleName;
@Size(min = 3, max = 50)
@Column(name = "last_name")
private String lastName;
@OneToMany(fetch = FetchType.LAZY,mappedBy = "teacher")
@JsonManagedReference
private Set<Address> addresses = new HashSet<>(0);
Getter Setter...
}
然后地址实体
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "address_id")
private Long addressId;
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
@JsonBackReference
private Teacher teacher;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "country_id", referencedColumnName = "country_id")
private Country country;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "state_id", referencedColumnName = "state_id")
private State state;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "district_id", referencedColumnName = "district_id")
private District district;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "tahasil_id", referencedColumnName = "tahasil_id")
private Tahasil tahasil;
@Column(name = "line_one")
private String lineOne;
@Column(name = "line_two")
private String lineTwo;
@Column(name = "landmark")
private String landmark;
@Column(name = "pincode")
private Integer pincode;
public Country getCountry() {
return country;
}
Other Getter Setter
国家/地区示例与州、地区和 tahasil 相同
@Entity
@Table(name = "countries", uniqueConstraints = { @UniqueConstraint(columnNames = { "country_name" }) })
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "country_id")
private Long countryId;
@NotBlank
@Size(min = 3, max = 50)
@Column(name = "country_name")
private String countryName;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "country")
private Address address;
Getter Setter
最后在控制器中我正在做
Optional<Teacher> teacher = teacherRepo.findByUserId(id);
if (!teacher.isPresent())
return ResponseEntity.notFound().build();
teacher.get().setUserId(id);
teacher.get().setFirstName(teacherUpdateForm.getFirstName());
teacher.get().setMiddleName(teacherUpdateForm.getMiddleName());
teacher.get().setLastName(teacherUpdateForm.getLastName());
teacher.get().setAddresses(teacherUpdateForm.getAddresses());
userRepository.save(teacher.get());
通过引用多个站点和读数来尝试这样做,但仍然无法看到对地址表的任何插入或更新。请帮助我理解我的错误。
问候, 切坦
解决方案
您需要级联教师实体的持久性。
更新 Teacher 实体中的 Address 属性定义:
@OneToMany(fetch = FetchType.LAZY,mappedBy = "teacher", cascade = CascadeType.ALL)
@JsonManagedReference
private Set<Address> addresses = new HashSet();
您可以根据需要使用级联类型值。
推荐阅读
- python - 分组后如何从seaborn swarmplot和各自的箱线图中排列点
- sqlite - SQLite 只返回重复的行
- apache-spark - 如何在 Spark SQL 中完成高度倾斜的联接?
- spring-boot - 如何配置 Zuul 网关(监听两个端口)根据端口和 url 组合拒绝请求?
- php - Heroku:已安装 FFMpeg,但 php 工作人员找不到它
- c++ - 将类方法设置为 OpenSSL 回调
- c# - 验证数字签名
- java - 返回带有对象列表的 ResponseEntity
- php - 表单提交在具有多个图像的移动设备中不起作用
- docker - Docker 的 SQL Server 2017 不起作用(因为缺少 ipv6?)