簡體   English   中英

Hibernate-使用mappedBy時外鍵為空

[英]Hibernate - Foreign key is empty while using mappedBy

我有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為空。 我期望我的外鍵將插入到那里。

在此處輸入圖片說明

我想念什么?

謝謝

您需要向我們展示保留您的實體的代碼,但我想您是沒有將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM