[英]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.