当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有没有办法使用SecondaryTable跳转多个表?》经验,为你挑选了1个好方法。

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

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

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



1> heenenee..:

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

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

请注意,派生属性仅使用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();
}

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

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


我喜欢你的瞬态方法的优雅,但这需要加载对象,而这些通常是不必要的(例如,在人为设计的扑克示例中,查看桌面上的所有人不需要全部取出获取显示名称的那些记录...)你的第一个建议虽然不那么优雅,但似乎完成了工作.我会看到有关测试这个明天,看看它是否执行预期,并且显然是HQL例子是*首选*,但不是必需的.我非常感谢你的回答,我会告诉你这是怎么回事!
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有