假设我有一个名为UserProfile的主用户表,并且有一个显示名称.
我有各种各样的模块,您可以使用UserProfile和ModuleId来表示您的ModuleMembership.然后,您可以为每个不同模块的个人资料存储与该模块相关的数据,例如,如果您注册了PokerModule,您将获得一个PokerProfile.
我想将UserProfile中的显示名称放在PokerProfile上,但是我想以正常的方式进行.我可以通过Hibernate或通过sql来做到这一点.确切的关系将是PokerProfile.membership.userProfile.displayName – 如何把它放到PokerProfile类的@Column中?
解决方法
您可以使用
derived property在您的PokerProfile类中获取displayName,如下所示:
@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名称.其他列名也被类似地定义.
然而,尽管这不是你所要求的,但我通常会在Java中实现我自己的快捷属性,如下所示:
@Transient public String getDisplayName() { if (membership == null) { return null; } UserProfile userProfile = membership.getUserProfile(); return userProfile == null ? null : userProfile.getDisplayName(); }