[英]Hibernate @OneToOne(fetch = FetchType.LAZY) is not working
用戶類
@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": "asd@asd.com",
"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,延遲加載不起作用。 可能是什么問題? 我認為這是因為來自Lombok的@Data
注釋並將它們轉換為@Getter/Setter
,但仍然相同。
也是BaseDomain.java 。
在序列化時,Jackson將調用getter方法,該方法將使用其代理檢索延遲加載的對象。 如果你檢查生成的sql,你會看到沒有基於findAll上的用戶id檢索fortune_capability,如果fetch很急,你會看到像這樣的sql
Hibernate: select fortunet_capability ......... where fortunet_capability [some generated text].user_id=?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.