为什么关联表不能正确使用hibernate进行更新? [英] Why Associated table not updating properly using hibernate?

查看:121
本文介绍了为什么关联表不能正确使用hibernate进行更新?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了员工和部门实体。这些具有双向多对一和一对多的关系。



使用REST客户端,我添加了部门和员工。

添加部门:

  {
name:IT
}



添加员工:

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





现在,部门已成功添加,但员工表未正确更新。除了id以外,其他字段都是空白的。理想情况下,hibernate应该用最新的部门ID更新员工。请让我知道这里可能会丢失什么?
Thanks。



Employee.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;

私人字符串名称;

@Embedded
私有地址;

@ManyToOne(cascade = CascadeType.MERGE)
私人部门部门;

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

Department.java em>

  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;

私人字符串名称;

@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();
尝试{
session.beginTransaction();

session.save(emp);

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

DepartmentRepository.java em>

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

session.save(department);

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

}


解决方案

您的实现使用了 javax.persistence 包,但是您将问题标记为 Hibernate Hibernate 只是JPA(Java持久性API)的实现之一。即使是 Hibernate 网页建议使用JPA。除非您维护遗留代码,否则最好使用JPA API来持久保存并获取您的实体。



现在回到您的问题:


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

为了能够坚持以及更新你的实体,你应该遵循以下步骤(代码行只是pseodo代码):


  • <创建一个部门实体的实例:

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


  • 获取现有的员工实体从一个事务中的数据库:

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


  • 将实体实例连接在一起:

      dept.getEmployees()添加(EMP); 
    emp.setDepartment(dept);


  • 坚持员工:

      session.save(DEPT); 




您应该在交易中完成所有这些工作,一切都应该按预期工作。


I have created Employee and Department entities. These are having bidirectional many-to-one and one-to-many relation.

Using REST client, I add department and employees.

Adding Department:

{
  "name":"IT"
}

Adding Employee:

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

Now, I want to add a new department by associating an existing employee.

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

Now, department is added successfully but employee table is not updated properly. Except id other fields are blanked out. Ideally, hibernate should have updated employee with latest department id. Please let me know what could be missing here? Thanks.

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

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

    }

解决方案

You're using javax.persistence package for your implementation, but you tagged your question as being Hibernate. Hibernate is just one of the implementations of the JPA (Java Persistence API). Even the Hibernate Web page recommends to use JPA. Unless you're maintaining a legacy code, you better use JPA API to persist and fetch your entities.

Now to your question:

Now, I want to add a new department by associating an existing employee.

To be able to persist as well as update your entities you should follow the following steps (code lines are just pseodo code):

  • Create an instance of Department entity:

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

  • Fetch an existing Employee entity from the database within a transaction:

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

  • Wire the entity instances together:

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

  • Persist the employee:

    session.save(dept);
    

You should do all these in a transaction and everything should work as expected.

这篇关于为什么关联表不能正确使用hibernate进行更新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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