7

考虑以下“模型”:

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 的选择查询。

这是相当无效的。

任何想法 ?

4

1 回答 1

3

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

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 中的情况要好得多),除非您使用 Hibernate 特定的生成器,否则您必须Id手动设置。有关详细信息,请参阅下面的问题。UserExtforeign

相关问题

于 2010-08-18T15:40:54.903 回答