我創建了一個兩個實體關系一對多(一個員工有多個地址)及其雙向關系,如多對一。@Entity@Table(name = "Employees")@EntityListeners(AuditingEntityListener.class)public class Employee {@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name="employee_id")private Long id;@NotBlankprivate String name;@NotBlankprivate String designation;@Temporal(TemporalType.TIMESTAMP)@LastModifiedDateprivate Date createdAt;@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL)private List<Address> employee_address;和地址實體如下 @Entity@Table(name = "address")public class Address { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long address_id; @NotBlank @Column(name = "address_street", length = 250) private String street; @NotBlank @Column(name = "address_city", length = 50) private String city; @NotBlank @Column(name = "address_state", length = 50) private String state; @NotBlank @Column(name = "address_zipcode", length = 10) private String zipcode; @JsonIgnore @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "employee_id", nullable = false, referencedColumnName = "employee_id") private Employee employee;和 EmployeeController 保存數據如下@RestControllerpublic class EmployeeController { @Autowired EmployeeDAO employeeDAO; @Autowired AddressDAO addressDAO; @PostMapping("/employees") public void createEmployee(@Valid @RequestBody Employee emp) { Address address = null; List<Address> listAddresses = new ArrayList<Address>(); if (emp != null) { Employee employee = new Employee(); employee.setDesignation(emp.getDesignation());
2 回答

鳳凰求蠱
TA貢獻1825條經驗 獲得超4個贊
在定義關系時的休眠中,您擁有關系的擁有方。關系的擁有方是粗略說的持有@JoinColumn 映射的一方。當調用 update/remove/persist 時,所有這些操作都是通過擁有方執行的。擁有集合時,您需要維護集合的兩端。
當您向 Employee 添加新地址時,您需要確保該地址也具有對 Employee 的反向引用。您的 Employee 實體是您的關系的所有者。
如果您有類別 - 項目關系,并且您將一個項目從一個類別移動到另一個類別。將 Item 從 category1 列表移動到 category2 列表是不夠的,您還需要更改 Item 中的反向引用。

森欄
TA貢獻1810條經驗 獲得超5個贊
您需要取消注釋該行:
address.setEmployee(employee);
在您的控制器中。
這是因為您定義了這樣的映射:
@JsonIgnore
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id", nullable = false, referencedColumnName = "employee_id")
private Employee employee;
nullable = false表明,必須有來自Adressto的引用Emplyee。但是錯誤可能來自對數據庫的約束,即該列不能為空。
添加回答
舉報
0/150
提交
取消