我有一个应用程序,它的域对象使用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“或类似的东西获取所有系统事件,并且知道所有这些relatedObjectIds都是"User”对象或类似对象的ID。
不幸的是,这导致了一个问题。我想不出一种方法来告诉Hibernate这种映射,这意味着HQL查询不能进行连接。我真的很想创建一个HQL查询,如下所示:
SELECT users FROM SystemEvent event join Users newUsers where event.eventType = 'SignUp'然而,Hibernate对SystemEvent和用户之间的关系一无所知,而且据我所知,也没有办法知道这一点。
所以我的问题是:当域对象通过ID号而不是类引用相互引用时,有没有办法告诉Hibernate一种关系?
发布于 2010-03-22 08:21:43
首先,当您有一个名称类似于'eventType‘的列时,您谈论的是一个鉴别器列。
其次,ORM提供的许多功能/便利是与业务对象而不是数据库交互的能力。
我会看看Hibernate文档中的Inheritance Chapter。
如果可以,我会设置一个名为SystemEvent的抽象类,在上面的示例中,它只有和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如果你想要我澄清这个答案的任何部分,请告诉我。
https://stackoverflow.com/questions/2489318
复制相似问题