簡體   English   中英

多對一關系中的休眠刷新

[英]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);
}

您還需要在子實體類中正確實現equalshashCode

看看我的代碼,

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM