[英]Hibernate - Foreign key is empty while using mappedBy
我有2個表Employee
& Vehicle
,其中一個雇員可以擁有多輛車。 以下是我定義的映射:
Employee.java
@Entity(name = "emp_details")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int empId;
@OneToMany(cascade = CascadeType.ALL, mappedBy="employee")
private List<Vehicle> vehicles = new ArrayList<>();
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public List<Vehicle> getVehicles() {
return vehicles;
}
public void setVehicles(List<Vehicle> vehicles) {
this.vehicles = vehicles;
}
}
Vehicle.java
@Entity
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int vehicleId;
@ManyToOne
@JoinColumn(name="empId")
private Employee employee;
private String name;
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public int getVehicleId() {
return vehicleId;
}
public void setVehicleId(int vehicleId) {
this.vehicleId = vehicleId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
主班
public class HibernateTest {
public static void main(String[] args) {
Employee emp = new Employee();
Vehicle vehicle = new Vehicle();
vehicle.setName("Honda");
emp.getVehicles().add(vehicle);
SessionFactory sFactory = new Configuration().configure().buildSessionFactory();
Session session = sFactory.openSession();
session.beginTransaction();
session.save(emp);
session.getTransaction().commit();
session.close();
StandardServiceRegistryBuilder.destroy(sFactory.getSessionFactoryOptions().getServiceRegistry());
}
}
但是,當我執行此命令時,Vehicle.employee_id為空。 我期望我的外鍵將插入到那里。
我想念什么?
謝謝
您需要向我們展示保留您的實體的代碼,但我想您是沒有將employee
設置為vehicle
。
您需要管理雙向實體關系的兩端。 您的代碼應如下所示
employee.getVehicles().add(vehicle);
vehicle.setEmployee(employee);
session.save(employee);
更新:
在這種情況下, Vehicle
是關系的擁有方,因為外鍵在其數據庫表中。 您剛剛將新車輛添加到員工的車輛列表中。 當您save
員工時,在Employee
的數據庫中沒有任何更改,並且save
操作級聯到Vehicle
。 車輛沒有設置其員工,它為null,因此將empId
列中放入null
最重要的是,您必須確保雙向關系的兩端都正確接線。
如果您具有雙向關系,則必須在兩側都設置該關系。
這意味着您還必須為vehicle
設置employee
。
您可以通過致電
vehicle.setEmployee(emp);
然后存儲或更新您的實體(如果尚未連接到會話)。
通常,要設置雙向關系,您需要在實體中提供特殊方法。
public class Vehicle {
...
public void setEmployee(Employee employee) {
this.employee = employee;
employee.addVehicle(this)
}
...
}
public class Employee {
...
public void addVehicle(Vehicle v) {
if(!vehicles.contains(v)) {
vehicles.add(v);
}
if(!this.equals(v.getEmployee()) {
v.setEmployee(this);
}
}
...
}
我認為需要編輯您的代碼。 您錯過了實體jpa規則。 您可以搜索jpa實體。 您會為您閱讀說明。 鏈接: 在此處輸入鏈接說明
(修改了Employee.java)
@Entity(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int idx;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "employee")
private List<Vehicle> vehicle = new ArrayList<>();
...
}
(修改了Vehicle.java)
@Entity
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int idx;
@ManyToOne
@JoinColumn(name="employee_id")
private Employee employee;
...
}
在Employee實體類中,您沒有在empId上使用@Column注釋。 在汽車類,你正在使用@JoinColumn(name =“雇員標識”)引用的員工,所以列EMPLOYEE_ID必須emp_details表中。 因此,您需要將Employee類修改為
@Id
@GeneratedValue
@Column(name="employee_id")
private int empId;
您只需要從員工實體級聯一個到多個
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.