我有一个user
(user_id
PK)实体,该实体与One-to-One
实体具有mentor_profile
关联。然后mentor_profile
与One-to-Many
有mentor_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
分开解决了这个问题。
是引起问题的共享密钥吗?
答案 0 :(得分:0)
懒惰不适用于OneToOne映射。最好将其更改为@ ManyToOne,Lazy会对其进行处理。