[英]Hibernate refresh in many-to-one relation
我有这个 2 域模型:
员工
public class Employee {
private Long id;
private String name;
private String family;
private Company company;
//getter & setter
}
和公司:
公共类公司{
private Long id;
private String name;
private Set<Employee> employees;
//getter & setter
}
Employee 和 Company 是多对一的关系,从 Company 端来看是一对多的关系。
我在交易中保存了一个公司对象,然后在该公司保存了员工:
@Transactional
puplic Long Save (){
Company cmp=new Company();
cmp.setName("Oracle");
session.save(cmp);
Employee employee=new Employee();
employee.setName("james");
employee.setFamily("dep");
employee.setCompany(cmp);
cmp.getEmployees();//will raise NullPointerException
cmp=session.get(cmp.getId());//because of first level cache it doesnt load it
}
保存员工后,如果我想从公司获取员工的集合,它将引发空指针异常,如果我想加载它,因为一级缓存休眠将不会触及数据库并且员工集仍然为空。
第一个解决方案是我可以在保存员工后刷新 Company 对象,但我认为 hibernate 必须有除此之外的解决方案。
您永远不应该使用null
,因此您应该将映射更改为:
private Set<Employee> employees = new HashSet<>();
这样,您甚至不需要 setter,因为 getter 就足够了。 另外,请确保同步双向关联的双方:
public void addEmployee(Employee employee) {
employees.add(employee);
employee.setCompany(this);
}
public void removeEmployee(Employee employee) {
employees.remove(employee);
employee.setCompany(null);
}
您还需要在子实体类中正确实现equals
和hashCode
。
看看我的代码,
在 commit() 事务之后,只有你可以获得持久对象,
public class Employee {
private Long id;
private String name;
private String family;
@ManyToOne
@JoinColumn(name = "company_id_fk")
private Company company;
//getter & setter
}
public class Company {
private Long id;
private String name;
@OneToMany(mappedBy="company")
List<Employee> listOfEmployees = new ArrayList<Employee>();
//getter & setter
}
puplic Long Save (){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try{
Company cmp=new Company();
cmp.setName("Oracle");
session.save(cmp);
Employee employee=new Employee();
employee.setName("james");
employee.setFamily("dep");
employee.setCompany(cmp);
session.save(employee);
transaction.commit();
List<Employee> listOfEmployees = cmp.getListOfEmployees();
if(listOfEmployees !=null && !listOfEmployees .isEmpty()){
for(Employee employ:listOfEmployees){
//You can wt you want
}
}
}catch(Exception e){
transaction.rollback();
}finally{
session.close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.