java - Hibernate - 使用mappedBy时外键为空

标签 java hibernate jpa

我有 2 个表EmployeeVehicle,其中一名员工可以拥有多辆车。 下面是我定义的映射:

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 为空。我期望我的外键将被插入那里。

enter image description here

我错过了什么?

谢谢

最佳答案

您需要向我们展示保存您的实体的代码,但我的猜测是您没有将 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/

相关文章:

java - 如何使用camel-avro-消费者和生产者?

java - 使用 Hibernate/JPA 映射和 JUnit 测试 DAO 的公式

java - 无法通过反射 getter 获取字段值

spring - 如何使用 Spring Data JPA 根据 bool 参数包含或排除记录?

java - JPA:@ElementCollection 和 InheritanceType.TABLE_PER_CLASS -> 重复的列名

java - JSF 是一个框架还是一个 API?

java - Vaadin 可识别不同应用程序的不同浏览器大小,但设备相同

hibernate - 删除Grails中的子级

Java 通过套接字传输多个文件

java - Hibernate @Version 不适用于一对多