代码之家  ›  专栏  ›  技术社区  ›  Brandon Yarbrough

休眠“加入…开”?

  •  2
  • Brandon Yarbrough  · 技术社区  · 16 年前

    我有一个将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

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

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

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

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

    1 回复  |  直到 16 年前
        1
  •  4
  •   RKitson    16 年前

    首先,当您有一个名为“eventType”的列时,您指的是一个鉴别器列。

    我想看看 Inheritance Chapter

    @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
    

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