我有 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
是关系的拥有方,因为外键位于其数据库表中。您刚刚将新车添加到员工的车辆列表中。当您保存
员工时,Employee
的数据库中没有任何内容可以更改,并且保存
操作会级联到Vehicle
。 Vehicle 没有设置员工,为 null,因此将 null
放入 empId
列
底线,您必须确保双向关系的双方都正确连接。
关于java - Hibernate - 使用mappedBy时外键为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38891442/