Hibernate中的@OneToOne(fetch=FetchType.LAZY)不起作用。

3

用户类

@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);
    }
}

当我获取用户列表时,使用userRepository.findAll();命令后返回以下JSON格式数据:
{
    "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


你是如何获取这个JSON的? - Amer Qarabsa
正如我所说,通过使用RestController扩展CrudRepositoryuserRepository - Ozgur
执行findAll时,请检查生成的SQL,是否看到了一个join? - Amer Qarabsa
不,它会创建另一个SELECT来获取数据。 - Ozgur
获取 FortuneTeller? - Amer Qarabsa
如果我看得正确,是的。 - Ozgur
1个回答

2

在序列化时,Jackson会调用getter方法,进而使用其代理检索懒加载的对象。 如果您检查生成的SQL语句,您将看到在findAll中没有基于用户ID检索fortune_capability,如果获取是急切的,您将看到像这样的SQL

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

1
在您的帮助下进行了一些搜索后,我发现我的问题是由Jackson库引起的。(https://dev59.com/42Ei5IYBdhLWcg3wDoaV) - Ozgur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接