2017-03-24 35 views
1

Hibernate newb試圖理解LAZY和EAGER抓取之間的區別。Hibernate - FetchType.LAZY熱切加載數據

地址模式:

​​

系車型:

@Entity 
public class Department { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column 
    private String name; 

    @OneToOne(mappedBy = "department", fetch = FetchType.LAZY) 
    private Address address; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 

    @Override 
    public String toString() { 
     return "Department [id=" + id + ", name=" + name + "]"; 
    } 
} 

測試方法:

@Test 
    public void testDepartment() { 
     Long departmentID; 
     Department department; 

     Long addressId; 
     Address address; 

     try (Session session = SessionUtil.getSession()) { 
      Transaction tx = session.beginTransaction(); 

      department = new Department(); 
      department.setId(69L); 
      department.setName("company"); 

      address = new Address(); 
      address.setCity("city"); 
      address.setStreet("street"); 
      address.setDepartment(department); 

      session.save(department); 
      session.save(address); 

      departmentID = department.getId(); 
      addressId = address.getId(); 
      tx.commit(); 
     } 

     try (Session session = SessionUtil.getSession()) {   
      department = session.load(Department.class, departmentID); 
      System.out.println(department.getId()); 
     } 
    } 

,當我從分貝以下查詢執行加載部門的對象。

Hibernate: select department0_.id as id1_2_0_, department0_.name as name2_2_0_ from Department department0_ where department0_.id=? 
Hibernate: select address0_.id as id1_0_1_, address0_.city as city2_0_1_, address0_.department_id as departme4_0_1_, address0_.street as street3_0_1_, department1_.id as id1_2_0_, department1_.name as name2_2_0_ from Address address0_ left outer join Department department1_ on address0_.department_id=department1_.id where address0_.department_id=? 
1 

我很驚訝看到聯接選擇查詢,因爲我從來沒有要求一個地址對象明確,它應該被延遲加載。

回答

1

如果你看一下FetchType.LAZY的Javadoc,你會看到,有沒有擔保(相對於熱切fetchinig):

懶惰的策略是一個暗示,持久性提供運行時 數據在第一次訪問時應該被延遲取出。允許 實現熱切地獲取LAZY 策略提示已被指定的數據。

對於OneToOne可選的依賴關係,在您的情況下,這是非常符合事實的。

這裏是一些進一步與一些解決方法讀,如果你真的需要實現延遲加載這種關係:post 1post 2

相關問題