首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate "JOIN ... ON"?

Hibernate "JOIN ... ON"?
EN

Stack Overflow用户
提问于 2010-03-22 08:03:01
回答 1查看 3.8K关注 0票数 2

我有一个应用程序,它的域对象使用Hibernate。应用程序的一部分在几个应用程序之间是通用的,它对其他系统一无所知。为了处理关系,我们的类看起来像这样:

代码语言:javascript
复制
@Entity
public class SystemEvent {
   @Id @GeneratedValue
   public int entity_id;

   @Column(name="event_type")
   public String eventType;

   @Column(name="related_id")
   public int relatedObjectId;
}

relatedObjectId持有几个不同对象之一的外键,具体取决于事件的类型。当系统想要了解与其兴趣相关的事件时,它会使用eventType "NewAccounts“或类似的东西获取所有系统事件,并且知道所有这些relatedObjectIds都是"User”对象或类似对象的ID。

不幸的是,这导致了一个问题。我想不出一种方法来告诉Hibernate这种映射,这意味着HQL查询不能进行连接。我真的很想创建一个HQL查询,如下所示:

代码语言:javascript
复制
SELECT users FROM SystemEvent event join Users newUsers where event.eventType = 'SignUp'

然而,Hibernate对SystemEvent和用户之间的关系一无所知,而且据我所知,也没有办法知道这一点。

所以我的问题是:当域对象通过ID号而不是类引用相互引用时,有没有办法告诉Hibernate一种关系?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-22 08:21:43

首先,当您有一个名称类似于'eventType‘的列时,您谈论的是一个鉴别器列。

其次,ORM提供的许多功能/便利是与业务对象而不是数据库交互的能力。

我会看看Hibernate文档中的Inheritance Chapter

如果可以,我会设置一个名为SystemEvent的抽象类,在上面的示例中,它只有和ID,每个具体的实现都会包含“relatedObject”的特定字段/属性。对于这种类型的场景,我通常使用“每个类的表”或“每个子类的表”映射。

代码语言:javascript
复制
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class SystemEvent {
   @Id @GeneratedValue
   public int eventId;
}

@Entity
@PrimaryKeyJoinColumn(name="event_id")
public class SignupEvent extends SystemEvent {
   @Column(name="user_id")
   public User user;
}

@Entity
@PrimaryKeyJoinColumn(name="event_id")
public class OtherEvent extends SystemEvent {
   @Column(name="other_id")
   public OtherAssociatedObject otherAssociatedObject;
}

您可以将您的HQL修改为如下所示:

代码语言:javascript
复制
SELECT users FROM SignupEvent event join Users newUsers

如果你想要我澄清这个答案的任何部分,请告诉我。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2489318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档