我有一个使用 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;
}
latedObjectId
持有多个不同对象之一的外键,具体取决于事件的类型。当系统想要了解与其兴趣相关的事件时,它会获取事件类型为“NewAccounts”或类似内容的所有系统事件,并且它知道所有这些 relatedObjectId 都是“User”对象或类似对象的 ID。
不幸的是,这导致了一个问题。我无法找到一种方法来告诉 Hibernate 有关此映射的信息,这意味着 HQL 查询无法执行连接。我真的很想创建一个如下所示的 HQL 查询:
SELECT users FROM SystemEvent event join Users newUsers where event.eventType = 'SignUp'
但是,Hibernate 不知道 SystemEvent 和 Users 之间的关系,据我所知,没有办法告诉它。
所以这是我的问题:当您的域对象通过 ID 号而不是类引用相互引用时,有什么方法可以告诉 Hibernate 有关关系吗?
最佳答案
首先,当您有一个名称类似于“eventType”的列时,您正在谈论的是鉴别器列。
其次,ORM 提供的许多功能/便利是与业务对象而不是数据库交互的能力。
我会看一下 Inheritance Chapter在 Hibernate 文档中。
如果可以的话,我会设置一个名为 SystemEvent 的抽象类,从上面的示例来看,它只有 和 ID。每个具体实现将包含“相关对象”的特定字段/属性。对于这种类型的场景,我通常使用“每个类一个表”或“每个子类一个表”映射。
@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
如果您希望我澄清此答案的任何部分,请告诉我。
关于 hibernate "JOIN ... ON"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2489318/