一尘不染

Hibernate将两个表映射到一个类

hibernate

我需要将两个表映射到一个类,但很难弄清楚。一个表是ROOMS,另一个表是TRAINERS。

ROOMS表:

OOC_UNIT_ID          NUMBER(6,0)
OOC_START_DT         DATE
OOC_START_TM         DATE
OOC_DT_MOD           DATE
OOC_USER_MOD         VARCHAR2(30 BYTE)
OOC_END_DT           DATE
OOC_END_TM           DATE
OOC_REASON_TX        VARCHAR2(250 BYTE)
OOC_RESERVED_FOR     VARCHAR2(30 BYTE)
OOC_CLS_ID           NUMBER(9,0)
OOC_TIMEFRAME        VARCHAR2(1 BYTE)
OOC_WSD_CD           VARCHAR2(2 BYTE)
OOC_TEAM_UNIT_ID     NUMBER(6,0)
OOC_WSD_ACT_RMAT_ID  NUMBER(6,0)

培训人员表:

TRSC_ID                NUMBER(9,0) -- generated sequence
TRSC_OOC_UNIT_ID       NUMBER(6,0)
TRSC_OOC_START_DT      DATE
TRSC_OOC_START_TM      DATE
TRSC_OOC_RESERVED_FOR  VARCHAR2(30 BYTE)
TRSC_TPOC_ID           NUMBER(6,0)
TRSC_DT_CREATED        DATE
TRSC_USER_CREATED      VARCHAR2(30 BYTE)
TRSC_DT_MOD            DATE
TRSC_USER_MOD          VARCHAR2(30 BYTE)
TRSC_REMARKS           VARCHAR2(250 BYTE)
TRSC_NOSHOW_REASON     VARCHAR2(100 BYTE)

表应当加入了OOC_UNIT_ID=TRSC_OOC_UNIT_IDOOC_START_DT=TRSC_OOC_START_DTOOC_START_TM=TRSC_OOC_START_TM

ROOMS表的主键是:OOC_UNIT_ID, OOC_START_DT, OOC_START_TM。TRAINERS表的主键是:TRSC_ID

我需要通过查询这个数据OOC_UNIT_IDOOC_START_DTOOC_START_TMOOC_END_DTOOC_END_TMOOC_WSD_ACT_RMAT_ID

在SQL中,可能类似于:

SELECT * 
  FROM TRAINERS t, ROOMS r
 WHERE t.TRSC_OOC_UNIT_ID = r.OOC_UNIT_ID
   AND t.TRSC_OOC_START_DT = r.OOC_START_DT
   AND t.TRSC_OOC_START_TM = r.OOC_START_TM
   AND ...

我正在项目中其他地方使用ROOMS表,它已经映射为独立对象。是否有一种方法可以将其用作TRAINERS对象的子对象,或者将这两个表映射到一个平面对象会更容易?映射的外观如何?

谢谢,尼克


阅读 245

收藏
2020-06-20

共1个答案

一尘不染

要将单个类映射到两个(或多个)单独的表,您需要使用@SecondaryTable批注:

@Table(name="ROOMS")
@SecondaryTable(name="TRAINERS", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="TRSC_OOC_UNIT_ID", referencedColumnName="OOC_UNIT_ID"),
    @PrimaryKeyJoinColumn(name="TRSC_OOC_START_DT", referencedColumnName="OOC_START_DT"),
    @PrimaryKeyJoinColumn(name="TRSC_OOC_START_TM", referencedColumnName="OOC_START_TM")
})
public class MyMergedEntity {

然后,您需要注释映射到TRAINERS表的每个单独的属性,@Column(table="TRAINERS")以指定它属于哪个表。如果您使用的是XML映射,则可以通过join元素完成上述所有操作。

综上所述,在我看来,您的两个表本质上是完全不同的,不应映射到单个类(尤其是因为您已经说过您已经映射ROOMS到其他地方)。也许您应该将Trainer映射为ManyToOne关联。

2020-06-20