Hibernate @OneToOne(fetch = FetchType.LAZY)无效

时间:2017-08-13 14:14:36

标签: java hibernate jpa spring-boot lazy-loading

用户类

@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

1 个答案:

答案 0 :(得分:2)

在序列化时,Jackson将调用getter方法,该方法将使用其代理检索延迟加载的对象。 如果你检查生成的sql,你会看到没有基于findAll上的用户id检索fortune_capability,如果fetch非常渴望你会看到像这样的sql

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