Dav*_*vid 6 hibernate hql one-to-one
考虑以下"模型":
USER
Long: PK
String: firstName
String: lastName
USER_EXT
Long: PK
String: moreInfo
Date: lastModified
Run Code Online (Sandbox Code Playgroud)
我正在尝试查找/创建正确的Hibernate映射(使用Annotations),这样,使用HQL查询就像"来自用户"一样简单,它将生成以下SQL:
select firstName, moreInfo from USER, USER_EXT where user.pk = user_ext.pk
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有的东西,从使用@Secondarytable到@OneToOne协会,但我不能让它工作.
我现在得到的最好结果是@OneToOne关联生成多个SQL查询,一个用于获取USER中的行,而结果集中的每一行都有一个来自USER_EXT的select查询.
这是非常无效的.
任何的想法 ?
OneToOne在和之间进行选择Secondarytable在某种程度上取决于对象模型(即,如果您想要用户扩展的实体)。我选择使用一个OneToOne关联和两个实体。
对于User(注意使用 来PrimaryKeyJoinColumn表示共享主键):
@Entity
public class User {
@Id private Long id;
private String firstName;
private String lastName;
@OneToOne
@PrimaryKeyJoinColumn
private UserExt userExt;
public UserExt getUserExt() {
return userExt;
}
public void setUserExt(UserExt userExt) {
this.userExt = userExt;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
还有UserExt:
@Entity
public class UserExt {
@Id private Long id;
private String moreInfo;
@Temporal(TemporalType.DATE)
private Date lastModified;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMoreInfo() {
return moreInfo;
}
public void setMoreInfo(String moreInfo) {
this.moreInfo = moreInfo;
}
public Date getLastModified() {
return lastModified;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
}
Run Code Online (Sandbox Code Playgroud)
有了上面的实体,下面的HQL查询:
select u.firstName, u.userExt.moreInfo from User u
Run Code Online (Sandbox Code Playgroud)
生成以下 SQL 查询:
select
userx0_.firstName as col_0_0_,
userextx1_.moreInfo as col_1_0_
from
User userx0_,
UserExt userextx1_
where
userx0_.id=userextx1_.id
Run Code Online (Sandbox Code Playgroud)
这是预期的结果。
PS:JPA 1.0 实际上对派生标识符的支持很差(JPA 2.0 中的情况要好得多),除非您使用 Hibernate 特定的生成器,否则您必须Id在 上手动设置。有关详细信息,请参阅下面的问题。UserExtforeign
| 归档时间: |
|
| 查看次数: |
1425 次 |
| 最近记录: |