为什么关联表不能使用hibernate正确更新?

7dl7o3gd  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(341)

我创建了员工和部门实体。它们具有双向的多对一和一对多关系。
使用rest客户端,我添加了部门和员工。
添加部门:

{
  "name":"IT"
}


添加员工:

{"name": "Emp01" ,
 "address": 
    {
     "street" :"Street01" ,
     "city" :"City01" ,
     "state" :"State01" ,
     "country" :"Country01"
    },
 "department":{"id":"1"}
}


现在,我想通过关联现有员工来添加一个新部门。

{
  "name":"Admin",
  "employees":
  [{
      "id":3
    }]
}



现在,部门添加成功,但员工表没有正确更新。除id外,其他字段均为空白。理想情况下,hibernate应该用最新的部门id更新员工。请告诉我这里可能缺少什么?谢谢。
员工.java

package com.empcatalogue.model;

import javax.persistence.CascadeType;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;

    @Embedded
    private Address address;

    @ManyToOne(cascade = CascadeType.MERGE)
    private Department department;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}

部门.java

package com.empcatalogue.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "department", fetch = FetchType.EAGER)
    private List<Employee> employees = new ArrayList<>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(List<Employee> employees) {
        this.employees = employees;
    }

}

employeerepository.java文件

...
...
...    
public void addEmployee(Employee emp) {

    Session session = RepoManager.getSessionFactory().openSession();
        try {
            session.beginTransaction();

            session.save(emp);

            session.getTransaction().commit();
        } catch (Exception e) {
            session.getTransaction().rollback();
        } finally {
            session.close();
        }
    }

departmentrepository.java文件

...
...
...
    public void addDepartment(Department department) {
        Session session = RepoManager.getSessionFactory().openSession();
        try {
            session.beginTransaction();

            session.save(department);

            session.getTransaction().commit();
        } catch (Exception e) {
            session.getTransaction().rollback();
        } finally {
            session.close();
        }

    }
7gyucuyw

7gyucuyw1#

你用的是 javax.persistence 包,但您将问题标记为 Hibernate . Hibernate 只是jpa(javapersistenceapi)的实现之一。即使是 Hibernate 网页推荐使用jpa。除非维护遗留代码,否则最好使用jpaapi来持久化和获取实体。
现在回答你的问题:
现在,我想通过关联现有员工来添加一个新部门。
为了能够持久化和更新实体,您应该遵循以下步骤(代码行只是pseodo代码):
创建的示例 Department 实体:

Department dept = new Department();
dept.setName(...);

获取现有的 Employee 事务中数据库中的实体:

Employee emp = session.get(Employee.class, <employee_id_here>);

将实体示例关联在一起:

dept.getEmployees().add(emp);
emp.setDepartment(dept);

员工:

session.save(dept);

您应该在事务中执行所有这些操作,并且一切都应该按预期工作。

相关问题