Hibernate - 使用mappedBy时,外键为空 [英] Hibernate - Foreign key is empty while using mappedBy

查看:147
本文介绍了Hibernate - 使用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;
}

}


$ 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());

}

}

但是当我执行此操作,Vehicle.employee_id为空。我期待着我的外键会被插入。





我缺少什么?



谢谢

解决方案

你需要向我们展示坚持你的实体的代码,但我的猜测是你没有将 employee 设置为车辆



您需要管理双向实体关系的双方。你的代码应该看起来像这样

  employee.getVehicles()。add(vehicle); 
vehicle.setEmployee(employee);

session.save(employee);

更新:

在这种情况下, Vehicle 是关系的拥有方,因为外键在其数据库表中。您只是将新车添加到员工的车辆列表中。当保存员工时,员工数据库中没有任何更改,保存操作级联到车辆。 Vehicle没有设置它的员工,它是空的,所以它将 null 放入 empId 列中。



底线,您必须确保双向关系的双方正确连线。


I've 2 tables Employee & Vehicle, where one employee can have multiple vehicles. Below is the mapping that I've defined:

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;
    }

}

Main class

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());

    }

}

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 employee to the vehicle.

You need to manage both sides of bidirectional entity relationship. Your code should look something like this

employee.getVehicles().add(vehicle);
vehicle.setEmployee(employee);

session.save(employee);

UPDATE:

In this case, 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 Employees 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

Bottom line, you have to make sure both sides of bidirectional relationship are wired up correctly.

这篇关于Hibernate - 使用mappedBy时,外键为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆