2017-08-13 48 views
1

用户类休眠@OneToOne(取= FetchType.LAZY)不工作

@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": "[email protected]", 
    "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不起作用。可能是什么问题?我认为这是因为龙目岛的@Data注释,并将它们转换为@Getter/Setter,但仍然相同。

BaseDomain.java

+0

你是如何得到这个JSON? –

+0

正如我通过'userRepository'所说的那样,它使用'RestController'扩展了'CrudRepository'。 – Ozgur

+0

当findAll被执行时,检查生成的sql,你看到连接了吗? –

回答

2

关于序列化杰克逊将调用getter方法,作为回报将使用其代理检索延迟加载的对象。 如果您检查生成的SQL,你会看到没有fortune_capability正在基于对的findAll其用户ID检索,若取渴望,你会看到这样的SQL

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

根据你的帮助找了一下我的问题是由杰克逊图书馆引起的。 (https://stackoverflow.com/questions/21708339/avoid-jackson-serialization-on-non-fetched-lazy-objects) – Ozgur