使用 Hibernate,我創建了兩個物體 - Employee 和 EmployeeDetails。由于 EmployeeDetails 在 Employee 中沒有相應的條目就不能存在,我想我不需要 EmployeeDetails 的額外 ID,而是可以使用 Employee 物體的 ID。這是我如何實作這個想法的:
員工物體:
@Entity
@Table(name = "employees")
@Data
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "employee_id")
private Long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@OneToOne(cascade = CascadeType.ALL)
EmployeeDetails employeeDetails;
}
員工詳細資訊物體:
@Entity
@Table(name = "employee_details")
@Data
public class EmployeeDetails {
@Id
private Long id;
@Column(name = "address")
private String address;
@Column(name = "e_mail", nullable = false)
private String eMail;
@Column(name = "phone")
private String phone;
@MapsId
@OneToOne(mappedBy = "employeeDetails", cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id")
private Employee employee;
}
通過將@MapsId注釋添加到 EmployeeDetails 中的員工變數,我應該將 Employee-entity 的主鍵分配給 EmployeeDetails 的 Id 列。
第二步,我將一些資料寫入我的兩個表中。
MySQL 資料庫中的員工表:
employee_id first_name last_name employee_details_employee_id
1 John Smith null
2 Jennifer Adams null
最后一列是由 Hibernate 以某種方式生成的。我不明白為什么。它似乎是一些用于識別的列,但我不需要它。
MySQL資料庫中的employee_details表:
employee_id address e_mail phone
1 null [email protected] null
2 null [email protected] null
我只給員工分配了一個電子郵件。令人驚訝的是,此資料庫表中沒有員工條目。反正我真的不需要它,但我期待它。所以,是的,我認為我做錯了什么,非常感謝一些幫助。
uj5u.com熱心網友回復:
更改mappedBy side,這里有用的鏈接
https://vladmihalcea.com/change-one-to-one-primary-key-column-jpa-hibernate/ https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship- with-jpa-and-hibernate/ https://javabydeveloper.com/one-one-bidirectional-association/
@Entity
@Table(name = "employees")
@Data
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "employee_id")
private Long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@OneToOne(mappedBy = "employee", cascade = CascadeType.ALL)
EmployeeDetails employeeDetails;
}
Entity
@Table(name = "employee_details")
@Data
public class EmployeeDetails {
@Id
private Long id;
@Column(name = "address")
private String address;
@Column(name = "e_mail", nullable = false)
private String eMail;
@Column(name = "phone")
private String phone;
@MapsId
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id")
private Employee employee;
}
uj5u.com熱心網友回復:
@MapId不是與 Hibernate 一起使用的流行解決方案。也許在你的情況下,@Embeddable會是一個更好的選擇?
如果我理解正確,EmployeeDetails沒有相關Employee. 因此,EmployeeDetails可以是一個欄位Employee作為可嵌入欄位:
@Entity
@Table(name = "employees")
@Data
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "employee_id")
private Long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Embedded
EmployeeDetails employeeDetails;
}
然后EmployeeDetails不需要 ID 和與員工的關系:
@Embeddable
public class EmployeeDetails {
@Column(name = "address")
private String address;
@Column(name = "e_mail", nullable = false)
private String eMail;
@Column(name = "phone")
private String phone;
}
如您所見,現在資料庫中只有一張表employees,但在我們的休眠模型中,我們有兩個獨立的物件。可能你不需要EmployeeDetails沒有Employee物體,所以有更有效的構造。
如果你真的需要一個分開的表EmployeeDetails有關系Employee,我建議創建標準一個一對一的映射,而不是@MapId建設。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388655.html
