休眠 @OneToOne(fetch = FetchType.LAZY) 不工作
Hibernate @OneToOne(fetch = FetchType.LAZY) is not working
用户class
@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);
}
}
财富能力:
@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
,但仍然相同。
在序列化时,Jackson 将调用 getter 方法,该方法在 return 中将使用其代理检索延迟加载的对象。
如果您检查生成的 sql,您将看到没有 fortune_capability 是根据其在 findAll 上的用户 ID 检索的,如果提取是急切的,您会看到 sql 像这样
Hibernate: select fortunet_capability ......... where fortunet_capability [some generated text].user_id=?
用户class
@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);
}
}
财富能力:
@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
,但仍然相同。
在序列化时,Jackson 将调用 getter 方法,该方法在 return 中将使用其代理检索延迟加载的对象。 如果您检查生成的 sql,您将看到没有 fortune_capability 是根据其在 findAll 上的用户 ID 检索的,如果提取是急切的,您会看到 sql 像这样
Hibernate: select fortunet_capability ......... where fortunet_capability [some generated text].user_id=?