有没有办法使用SecondaryTable跳转多个表?

cor*_*iKa 9 java hibernate

假设我有一个名为的主用户表UserProfile,并且在其上有一个显示名称.

我有各种各样的模块,你可以成为其中的一个,UserProfile并用ModuleId它来表示你的ModuleMembership.然后,您可以为每个不同的模块创建一个配置文件,以存储与该模块相关的数据,例如,如果您已注册,那么PokerModule您将获得一个PokerProfile.

我想把显示名称UserProfile放在上面PokerProfile,但我想以标准化的方式进行.我可以通过Hibernate或通过SQL来实现,无论哪种方式都可以.确切的关系是PokerProfile.membership.userProfile.displayName- 我怎么能把它变成课堂@Column上的PokerProfile

hee*_*nee 9

您可以使用衍生属性来获取displayName你的PokerProfile类,如下所示:

@Formula(
    "(SELECT up.displayName"
        + " FROM ModuleMembership mm"
        + " JOIN UserProfile up"
        + " ON (mm.userProfileId = up.userProfileId)"
        + " WHERE mm.moduleMembershipId = membershipId)")
String displayName;
Run Code Online (Sandbox Code Playgroud)

请注意,派生属性仅使用SQL,而不使用HQL. membershipId被定义为属性的@JoinColumn名称membership.其他列名称也是类似定义的.

但是,虽然它不是你要求的,但我通常在Java中实现我自己的快捷方式属性,如下所示:

@Transient
public String getDisplayName() {
    if (membership == null) {
        return null;
    }
    UserProfile userProfile = membership.getUserProfile();
    return userProfile == null ? null : userProfile.getDisplayName();
}
Run Code Online (Sandbox Code Playgroud)

对我来说,快捷方式属性比相应的SQL更容易读写.

使用Hibernate 5.0.6.Final对H2数据库版本1.4.190测试代码样本.

  • 我喜欢你的瞬态方法的优雅,但这需要加载对象,而这些通常是不必要的(例如,在人为设计的扑克示例中,查看桌面上的所有人不需要全部取出获取显示名称的那些记录...)你的第一个建议虽然不那么优雅,但似乎完成了工作.我会看到有关测试这个明天,看看它是否执行预期,并且显然是HQL例子是*首选*,但不是必需的.我非常感谢你的回答,我会告诉你这是怎么回事! (2认同)