Hibernate - 使用mappedBy时,外键为空 [英] Hibernate - Foreign key is empty while using mappedBy
问题描述
我有两张表员工
& 车辆
,其中一名员工可以有多辆车。
下面是我定义的映射:
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>车辆=新的ArrayList<>();
public int getEmpId(){
return empId;
}
public void setEmpId(int empId){
this.empId = empId;
}
public List< Vehicle> getVehicles(){
返回车辆;
}
public void setVehicles(List< Vehicle> vehicles){
this.vehicles = vehicles;
}
}
Vehicle.java
@Entity
公共类车辆{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int vehicleId;
@ManyToOne
@JoinColumn(name =empId)
私人员工员工;
私人字符串名称;
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;
}
}
但是当我执行此操作,Vehicle.employee_id为空。我期待着我的外键会被插入。 我缺少什么? 谢谢 你需要向我们展示坚持你的实体的代码,但我的猜测是你没有将 您需要管理双向实体关系的双方。你的代码应该看起来像这样 更新: 在这种情况下, 底线,您必须确保双向关系的双方正确连线。 I've 2 tables Employee.java Vehicle.java Main class But when I execute this, Vehicle.employee_id is empty. I was expecting that my foreign key will be inserted there. What am I missing? Thank You You need to show us the code that persists your entities, but my guess is that you are not setting the You need to manage both sides of bidirectional entity relationship. Your code should look something like this UPDATE: In this case, Bottom line, you have to make sure both sides of bidirectional relationship are wired up correctly. 这篇关于Hibernate - 使用mappedBy时,外键为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
$ b $ pre $ public class HibernateTest {
public static void main(String [] args){
Employee emp = new Employee();
车辆=新车();
vehicle.setName(Honda);
emp.getVehicles()。add(vehicle);
SessionFactory sFactory = new Configuration()。configure()。buildSessionFactory();
会话会话= sFactory.openSession();
session.beginTransaction();
session.save(emp);
session.getTransaction()。commit();
session.close();
StandardServiceRegistryBuilder.destroy(sFactory.getSessionFactoryOptions()。getServiceRegistry());
}
}
employee
设置为车辆
。
employee.getVehicles()。add(vehicle);
vehicle.setEmployee(employee);
session.save(employee);
Vehicle
是关系的拥有方,因为外键在其数据库表中。您只是将新车添加到员工的车辆列表中。当保存
员工时,员工
数据库中没有任何更改,保存
操作级联到车辆
。 Vehicle没有设置它的员工,它是空的,所以它将 null
放入 empId
列中。
Employee
& Vehicle
, where one employee can have multiple vehicles.
Below is the mapping that I've defined:@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;
}
}
@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());
}
}
employee
to the vehicle
.employee.getVehicles().add(vehicle);
vehicle.setEmployee(employee);
session.save(employee);
Vehicle
is the owning side of the relation because the foreign key is in its database table. You just added the new vehicle to the employee's list of vehicles. When you save
the employee, there's nothing to change in Employee
s database, and the save
operation cascades to Vehicle
. Vehicle does not have its employee set, it is null, so it puts null
in empId
column