次要表或OnetoOne协会?

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查询.

这是非常无效的.

任何的想法 ?

Pas*_*ent 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;
    }
}
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

相关问题