Hibernate“JOIN ...... ON”?

时间:2010-03-22 00:03:01

标签: hibernate

我有一个使用Hibernate作为域对象的应用程序。应用程序的一部分在几个应用程序之间很常见,并且它不了解其他系统。为了处理关系,我们的课程看起来像这样:

@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”或某些此类事件来获取所有系统事件,并且它知道所有这些relatedObjectId都是“User”对象或类似物的ID。

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

SELECT users FROM SystemEvent event join Users newUsers where event.eventType = 'SignUp'

然而,Hibernate并不了解SystemEvent与用户之间的关系,据我所知,没有办法告诉它。

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

1 个答案:

答案 0 :(得分:4)

首先,当你有一个名为'eventType'的列时,你正在谈论一个鉴别器列。

其次,ORM提供的许多功能/便利是与您的Business Objects而不是您的数据库进行交互的能力。

我会看看Hibernate文档中的Inheritance Chapter

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

@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,如下所示:

SELECT users FROM SignupEvent event join Users newUsers

如果您希望我澄清此答案的任何部分,请与我联系。