Hibernate 休眠多对多关联+联接表+额外列更新工作不正常
我举一个例子。我有一个Employee类,它与Address类有多对多关系。我使用复合键在我的联接表中插入数据,该联接表有一个额外的列city 我所有的POJO都是 //雇员阶级Hibernate 休眠多对多关联+联接表+额外列更新工作不正常,hibernate,jpa,Hibernate,Jpa,我举一个例子。我有一个Employee类,它与Address类有多对多关系。我使用复合键在我的联接表中插入数据,该联接表有一个额外的列city 我所有的POJO都是 //雇员阶级 package com.test.manyToMany; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; im
package com.test.manyToMany;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;
@Entity(name="EMPLOYEE")
public class Employee {
private int id;
private String name;
private List<EmployeeAddress> employeeAddress;
@Id
@GenericGenerator(name="generator",strategy="increment")
@GeneratedValue(generator="generator")
@Column(name="ID",nullable=false,unique=true)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(fetch=FetchType.LAZY,mappedBy="pk.employee")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
public List<EmployeeAddress> getEmployeeAddress() {
return employeeAddress;
}
public void setEmployeeAddress(List<EmployeeAddress> employeeAddress) {
this.employeeAddress = employeeAddress;
}
}
//雇员地址ID
package com.test.manyToMany;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Embeddable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
@Embeddable
public class EmployeeAddressId implements Serializable{
private static final long serialVersionUID = -9120607274421816301L;
private Employee employee;
private Address address;
@ManyToOne
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
@ManyToOne
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result
+ ((employee == null) ? 0 : employee.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EmployeeAddressId other = (EmployeeAddressId) obj;
if (address == null) {
if (other.address != null)
return false;
} else if (!address.equals(other.address))
return false;
if (employee == null) {
if (other.employee != null)
return false;
} else if (!employee.equals(other.employee))
return false;
return true;
}
}
当我使用我的主类在db中插入一些数据时,一切都正常工作
package com.test.manyToMany;
import java.util.ArrayList;
import org.hibernate.Session;
import com.test.utils.HibernateUtil;
public class TestManyToMany {
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Employee employee1=new Employee();
EmployeeAddress employeeAddress=new EmployeeAddress();
Address address=new Address();
ArrayList<EmployeeAddress> list=new ArrayList<EmployeeAddress>();
address.setId(1);
employee1.setName("XYZ");
employeeAddress.setCity("CDE");
employeeAddress.setEmployee(employee1);
employeeAddress.setAddress(address);
list.add(employeeAddress);
employee1.setEmployeeAddress(list);
session.save(employee1);
session.getTransaction().commit();
}
}
它也在插入第二条记录
+-----------+----------+----+
|EMPLOYEE_ID|ADDRESS_ID|CITY|
+-----------+----------+----+
| 1 | 1 |CDE |
+-----------+----------+----+
|1 | 2 |CDE |
+-----------+----------+----+
我的第一条记录应该被删除,然后它应该插入第二条记录。这不会发生。Hi Raman,当您使用构造函数创建employee对象时,您是要创建新的employee实体还是要加载现有的employee实体?如果要更新现有实体的地址,应使用session.loadpk并获取对象,在修改地址列表之前。我只更新现有员工。但我给员工对象提供了相同的id。问题是Hibernate应该删除没有发生的我的第一条记录。这可能是因为复合键。因为当我使用相同的员工id 1和地址id 1编辑我的城市到CDE1时,它工作正常,并且处于休眠状态正在将我的城市更新为CDE1。
package com.test.manyToMany;
import java.util.ArrayList;
import org.hibernate.Session;
import com.test.utils.HibernateUtil;
public class TestManyToMany {
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Employee employee1=new Employee();
EmployeeAddress employeeAddress=new EmployeeAddress();
Address address=new Address();
ArrayList<EmployeeAddress> list=new ArrayList<EmployeeAddress>();
address.setId(1);
employee1.setName("XYZ");
employeeAddress.setCity("CDE");
employeeAddress.setEmployee(employee1);
employeeAddress.setAddress(address);
list.add(employeeAddress);
employee1.setEmployeeAddress(list);
session.save(employee1);
session.getTransaction().commit();
}
}
package com.test.manyToMany;
import java.util.ArrayList;
import org.hibernate.Session;
import com.test.utils.HibernateUtil;
public class TestManyToMany {
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Employee employee1=new Employee();
EmployeeAddress employeeAddress=new EmployeeAddress();
Address address=new Address();
ArrayList<EmployeeAddress> list=new ArrayList<EmployeeAddress>();
address.setId(2);
//session.save(address);
employee1.setId(1);
employee1.setName("XYZ");
employeeAddress.setCity("CDE");
employeeAddress.setEmployee(employee1);
employeeAddress.setAddress(address);
list.add(employeeAddress);
employee1.setEmployeeAddress(list);
//address.setEmployeeAddress(list);
//session.save(employee1);
session.update(employee1);
session.getTransaction().commit();
}
}
+-----------+----------+----+
|EMPLOYEE_ID|ADDRESS_ID|CITY|
+-----------+----------+----+
| 1 | 1 |CDE |
+-----------+----------+----+
+-----------+----------+----+
|EMPLOYEE_ID|ADDRESS_ID|CITY|
+-----------+----------+----+
| 1 | 1 |CDE |
+-----------+----------+----+
|1 | 2 |CDE |
+-----------+----------+----+