我有一个使用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关系?
答案 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
如果您希望我澄清此答案的任何部分,请与我联系。