Fetchtype.LAZY的行为类似于具有OneToOne映射的Fetchtype.EAGER

时间:2018-06-29 01:33:12

标签: hibernate jpa spring-data-jpa hibernate-mapping

我有一个useruser_id PK)实体,该实体与One-to-One实体具有mentor_profile关联。然后mentor_profileOne-to-Manymentor_history关联。
mentor_profile的主键是用户表中的共享PK,即user_id。

@Entity
@Table(name = "user")
public class User {

   @Id
   @GeneratedValue(strategy = IDENTITY)
   @Column(name = "user_id", unique = true, nullable = false)
   private Integer userId;

   @OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
   private MentorProfile mentorProfile;

mentor_profile

@Entity
@Table(name = "mentor_profile")
public class MentorProfile {

    @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "user"))
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "user_id", unique = true, nullable = false)
    private int userId;

    @OneToOne(fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    private User user;

    @Column(name = "is_looking_mentee")
    private Boolean isLookingMentee;

但是当触发select上的user查询时,即使我正在使用FetchType> LAZY,所有关联的一对一实体(具有用户的共享密钥)也会被选择。

Hibernate: select user0_.user_id as user_id1_43_, user0_.about as about2_43_ ............ from user user0_ where user0_.first_name=?
Hibernate: select mentorprof0_.user_id as user_id1_29_0_, ............. from mentor_profile mentorprof0_ where mentorprof0_.user_id=?
Hibernate: select trainerpro0_.user_id as user_id1_42_0_, ............. from trainer_profile trainerpro0_ where trainerpro0_.user_id=?

此模型背后的基本思想是:用户可以具有类似指导者的角色,例如培训师。并且,如果用户是指导者,则存在某些特定于指导者的列。例如,当他/她开始进行指导时,如果他有空可以进行指导等。由于这些详细信息是特定于工作(指导者,培训师)的,因此这些信息无法存储在用户表下。因为采用该设计,如果用户是指导者,那么与培训师相关的所有列都将为空白,这是一个糟糕的设计。根据{{​​3}},应该始终避免在数据库中使用空值,因为它们会浪费我们的内存和性能。因此,将user的专业与xx_profile分开解决了这个问题。

是引起问题的共享密钥吗?

1 个答案:

答案 0 :(得分:0)

懒惰不适用于OneToOne映射。最好将其更改为@ ManyToOne,Lazy会对其进行处理。