2016-08-21 53 views
1

我這個嘗試:春數據JPA - 懶惰的提取模式不工作的@OneToOne

@OneToOne(mappedBy = "user", fetch = FetchType.LAZY) 
private UserInfo userInfo; 

但上面的代碼不會懶洋洋地獲取。

而且還試圖用下面的代碼:

@Entity 
@NamedEntityGraph(name = "User.detail", attributeNodes = {}) 
public class User extends AbstractEntity { 

    @Enumerated(EnumType.ORDINAL) 
    @Column(name = "country", nullable = false) 
    private Country country; 

    @Column(name = "mobile_no", nullable = false) 
    private String mobileNo; 

    @Column(name = "password", nullable = false) 
    private String password; 

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY) 
    private UserInfo userInfo; 

    // Getter & setter 
} 

@Repository 
public interface UserRepository extends JpaRepository<User, Long> { 

    @EntityGraph(value = "User.detail", type = EntityGraphType.FETCH) 
    User findById(Long id); 
} 

這也不起作用。

有人能幫助我嗎?

+3

是否每個用戶都有一個UserInfo?如果是這樣,您應該將關聯標記爲可選= false。否則,Hibernate不知道它是否必須將該字段設置爲null或代理,並因此強制檢查用戶是否存在UserInfo。 –

+1

http://stackoverflow.com/questions/1444227/making-a-onetoone-relation-lazy –

+0

@jbnizet,我嘗試使用可選= false,但它不工作。我也試過@LazyToOne(value = LazyToOneOption.PROXY),但仍然無法正常工作。 –

回答

1

按照JPA 2.1(JSR 338)規範,部分41年1月11日的值FetchType.LAZY爲參數fetch只是一個提示:

是否關聯應延遲加載,或者必須使用預先抓取。戰略是對持久性提供商運行時的要求,必須熱切地提取關聯實體LAZY策略是向持久性提供程序運行時的提示

因此,如果關聯被熱切地提取,並不意味着FetchType.LAZY不起作用(如指定)。

對於您的問題可能的解決方案可能是從您的實體映射中刪除private UserInfo userInfo;,並將fetchUserInfo(Long userId)添加到您的UserRepository