2017-08-13 151 views
1

用戶類休眠@OneToOne(取= FetchType.LAZY)不工作

@Entity 
@Getter 
@Setter 
@NoArgsConstructor 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class User extends BaseDomain { 

    @Column(unique=true) 
    private String email; 
    private String name; 
    private String surname; 

    @JsonIgnore 
    private String password; 

    // fortune types 
    @OneToOne(fetch = FetchType.LAZY) 
    private FortuneTeller fortuneTeller; 
    private int isFortuneTeller; // for efficient searching 

    @Override 
    public boolean equals(Object o) { 
     return super.equals(o); 
    } 

    @Override 
    public String toString() { 
     return "User{} " + super.toString(); 
    } 

} 

算命:

@Entity 
public class FortuneTeller extends FortuneCapability { 

    @Override 
    public String toString() { 
     return super.toString(); 
    } 

    @Override 
    public boolean equals(Object o) { 
     return super.equals(o); 
    } 

} 

FortuneCapability:

@Entity 
@NoArgsConstructor 
@Getter 
@Setter 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class FortuneCapability extends BaseDomain { 

    private int totalFortune; 

    private int price; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "fortuneCapability") 
    private List<Review> reviews = new ArrayList<>(); 

    public void addReview(Review review) { 
     review.setFortuneCapability(this); 
     reviews.add(review); 
    } 

    @Override 
    public String toString() { 
     return super.toString(); 
    } 

    @Override 
    public boolean equals(Object o) { 
     return super.equals(o); 
    } 
} 

當我取用戶列表給出我這個JSON(我拿他們使用userRepository.findAll();):

{ 
    "id": "4028ab6a5ddbc746015ddbc776580003", 
    "createdAt": "13/08/2017", 
    "updatedAt": "13/08/2017", 
    "email": "[email protected]", 
    "name": null, 
    "surname": null,  
    "lastLogin": null, 
    "fortuneTeller": { 
     "id": "4028ab6a5ddbc746015ddbc7766f0006", 
     "createdAt": "13/08/2017", 
     "updatedAt": "13/08/2017", 
     "totalFortune": 0, 
     "price": 0, 
     "reviews": [ 
      { 
       "id": "4028ab6a5ddbc746015ddbc776710007", 
       "createdAt": "13/08/2017", 
       "updatedAt": "13/08/2017", 
       "content": "asd", 
       "rating": 0 
      } 
     ] 
    }, 
    "isFortuneTeller": 1 
} 

延遲加載對OneToOne或OneToMany不起作用。可能是什麼問題?我認爲這是因爲龍目島的@Data註釋,並將它們轉換爲@Getter/Setter,但仍然相同。

BaseDomain.java

+0

你是如何得到這個JSON? –

+0

正如我通過'userRepository'所說的那樣,它使用'RestController'擴展了'CrudRepository'。 – Ozgur

+0

當findAll被執行時,檢查生成的sql,你看到連接了嗎? –

回答

2

關於序列化傑克遜將調用getter方法,作爲回報將使用其代理檢索延遲加載的對象。 如果您檢查生成的SQL,你會看到沒有fortune_capability正在基於對的findAll其用戶ID檢索,若取渴望,你會看到這樣的SQL

Hibernate: select fortunet_capability ......... where fortunet_capability [some generated text].user_id=? 
+0

根據你的幫助找了一下我的問題是由傑克遜圖書館引起的。 (https://stackoverflow.com/questions/21708339/avoid-jackson-serialization-on-non-fetched-lazy-objects) – Ozgur