用户类
@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
,但仍然相同。
答案 0 :(得分:2)
在序列化时,Jackson将调用getter方法,该方法将使用其代理检索延迟加载的对象。 如果你检查生成的sql,你会看到没有基于findAll上的用户id检索fortune_capability,如果fetch非常渴望你会看到像这样的sql
Hibernate: select fortunet_capability ......... where fortunet_capability [some generated text].user_id=?