假设我有一个名为的主用户表UserProfile
,并且在其上有一个显示名称.
我有各种各样的模块,你可以成为其中的一个,UserProfile
并用ModuleId
它来表示你的ModuleMembership
.然后,您可以为每个不同的模块创建一个配置文件,以存储与该模块相关的数据,例如,如果您已注册,那么PokerModule
您将获得一个PokerProfile
.
我想把显示名称UserProfile
放在上面PokerProfile
,但我想以标准化的方式进行.我可以通过Hibernate或通过SQL来实现,无论哪种方式都可以.确切的关系是PokerProfile.membership.userProfile.displayName
- 我怎么能把它变成课堂@Column
上的PokerProfile
?
您可以使用衍生属性来获取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测试代码样本.