hibernate将两个表Map到一个类

sz81bmfz  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(357)

我需要将两个表Map到一个类,但我很难理解这一点。一张table是房间,另一张是运动鞋。
房间表:

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_ID , OOC_START_DT=TRSC_OOC_START_DT 以及 OOC_START_TM=TRSC_OOC_START_TM .
rooms表的主键是: OOC_UNIT_ID, OOC_START_DT, OOC_START_TM . 培训师表的主键是: TRSC_ID .
我需要通过 OOC_UNIT_ID , OOC_START_DT , OOC_START_TM , OOC_END_DT , OOC_END_TM 以及 OOC_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表,它已经Map为独立对象。有没有一种方法可以将它作为trainers对象上的子对象使用,或者将这两个表Map到一个平面对象会更容易?Map看起来怎么样?
谢谢,尼克

lx0bsm1f

lx0bsm1f1#

要将单个类Map到两个(或更多)单独的表,需要使用@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 {

然后需要对Map到的每个属性进行注解 TRAINERS 带的表格 @Column(table="TRAINERS") 指定它所属的表。如果您使用的是xmlMap,那么以上所有操作都可以通过join元素完成。
尽管如此,在我看来,您的两个表在本质上是相当不同的,不应该Map到单个类(特别是因为您已经说过您已经Map了一个类) ROOMS 其他地方)。也许你应该把你的培训师Map成多人协会。

dfddblmv

dfddblmv2#

可以创建绑定到自定义对象的命名查询。这是我将采用的解决方案,因为不需要对db进行任何更改。

9bfwbjaz

9bfwbjaz3#

在我的经验中,简单性是使用任何orm(包括hibernate)的关键。我会根据你的sql创建一个数据库视图,让我们称之为 TRAINERS_ROOMS 然后简单地将数据库视图Map到一个新的java对象,让我们调用它 TrainersRooms .
您可以获得简单易用的hibernateMap管理器,但是您当然可以使用这个新对象执行任何更新,因此如果您需要,这个解决方案将不适合您。

63lcw9qa

63lcw9qa4#

我提出的解决方案似乎可以用来查询数据,我还没有尝试过任何插入/更新/删除操作。
我创造了 TRAINER 对象来扩展 ROOM 对象。

public class Trainer extends Room {
  ...
}

然后我修改了 ROOM 要包含联接的子类,请执行以下操作:

<hibernate-mapping>
   <class name="Room" table="ROOMS">
      <composite-id> ...
      <property ...>
      ...

      <joined-subclass name="Trainer" table="TRAINERS">
         <key>
              <column ...>
              ...
         </key>
         <property ...>
         ...
      </joined-subclass>
   </class>
 ...

到目前为止,它似乎正在发挥作用。
谢谢,
尼克

相关问题