gpt4 book ai didi

hibernate - 辅助表还是一对一关联?

转载 作者:行者123 更新时间:2023-12-02 23:46:45 26 4
gpt4 key购买 nike

考虑以下“模型”:

USER
Long: PK
String: firstName
String: lastName

USER_EXT
Long: PK
String: moreInfo
Date: lastModified

我正在尝试查找/创建正确的 Hibernate 映射(使用注释),这样,使用像“来自用户”这样简单的 HQL 查询,它将生成以下 SQL:

select firstName, moreInfo from USER, USER_EXT where user.pk = user_ext.pk

我已经尝试了一切,从使用 @Secondarytable 到 @OneToOne 关联,但我无法使其工作。

我现在得到的最好结果是使用 @OneToOne 关联,它生成多个 SQL 查询,一个用于获取 USER 中的行,对于结果集中的每一行,一个来自 USER_EXT 的选择查询。

这是非常无效的。

有什么想法吗?

最佳答案

OneToOneSecondarytable 之间进行选择在某种程度上取决于对象模型(即,如果您想要用户扩展的实体)。我选择使用 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;
}
}

还有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;
}
}

使用上述实体,进行以下 HQL 查询:

select u.firstName, u.userExt.moreInfo from User u

生成以下 SQL 查询:

select
userx0_.firstName as col_0_0_,
userextx1_.moreInfo as col_1_0_
from
User userx0_,
UserExt userextx1_
where
userx0_.id=userextx1_.id

这是预期的结果。

PS:JPA 1.0 实际上对派生标识符的支持很差(JPA 2.0 中的情况要好得多),您必须在 UserExt 上手动设置 Id,除非您使用 Hibernate 特定的 foreign 生成器。有关详细信息,请参阅下面的问题。

相关问题

关于hibernate - 辅助表还是一对一关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com