Hibernate将两个表映射到一个类 [英] Hibernate Mapping Two Tables to One Class

查看:93
本文介绍了Hibernate将两个表映射到一个类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将两个表映射到一个类,无法解决这个问题。一张桌子是ROOMS,另一个是TRAINERS。



ROOMS表:

  OOC_UNIT_ID NUMBER(6,0) 
OOC_START_DT日期
OOC_START_TM日期
OOC_DT_MOD日期
OOC_USER_MOD VARCHAR2(30字节)
OOC_END_DT日期
OOC_END_TM日期
OOC_REASON_TX VARCHAR2(250字节)
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)

TRAINERS表:

  TRSC_ID NUMBER(9,0) - 生成的序列
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_D T_MOD日期
TRSC_USER_MOD VARCHAR2(30字节)
TRSC_REMARKS VARCHAR2(250字节)
TRSC_NOSHOW_REASON VARCHAR2(100字节)

表应加入 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 。 TRAINERS表的主键是: TRSC_ID



我需要通过 OOC_UNIT_ID , OOC_START_DT OOC_START_TM OOC_END_DT OOC_END_TM OOC_WSD_ACT_RMAT_ID



在SQL中,它可能类似于:

  SELECT * 
来自培训师t,房间r
其中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对象上的子对象使用,还是将这两个表映射为一个扁平对象会更容易?映射怎么看?



感谢,
Nick

解决方案

要将单个类映射到两个(或更多)单独的表,您需要使用

  @Table(name =ROOMS )
@SecondaryTable(name =TRAINERS,pkJoinColumns = {
@PrimaryKeyJoinColumn(name =TRSC_OOC_UNIT_ID,referencedColumnName =OOC_UNIT_ID),
@PrimaryKeyJoinColumn(name =TRSC_OOC_START_DT,参考列表名称=OOC_START_DT),
@PrimaryKeyJoinColumn(name =TRSC_OOC_START_TM,referencedColumnName =OOC_START_TM)
})
公共类MyMergedEntity {

然后,您需要使用<$ c注释映射到 TRAINERS 表的每个单独属性$ c> @Column(table =TRAINERS)来指定它属于哪个表。如果您使用的是XML映射,则可以通过加入元素。



所有这一切说,在我看来,你的两张桌子本质上是不同的,不应该映射到一个类(特别是因为你已经说过你已经在别处映射了 ROOMS )。也许你应该将你的教练映射为 ManyToOne 关联。


I need to map two tables to a single class, having trouble figuring this out. One table is ROOMS, the other is TRAINERS.

The ROOMS 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)

TRAINERS table:

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)

Tables should be joined on OOC_UNIT_ID=TRSC_OOC_UNIT_ID, OOC_START_DT=TRSC_OOC_START_DT and OOC_START_TM=TRSC_OOC_START_TM.

Primary Key for ROOMS table is: OOC_UNIT_ID, OOC_START_DT, OOC_START_TM. Primary Key for the TRAINERS table is: TRSC_ID.

I need to query this data by OOC_UNIT_ID, OOC_START_DT, OOC_START_TM, OOC_END_DT, OOC_END_TM and OOC_WSD_ACT_RMAT_ID.

In SQL it might be something like:

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 ...

I am using the ROOMS table elsewhere in the project and it is already mapped as a standalone object. Would there be a way to utilize that as a sub-object on a TRAINERS object, or would it be easier to map these two tables into one flat object? How would the mapping look?

Thanks, Nick

解决方案

To map a single class to two (or more) separate tables you need to use a @SecondaryTable annotation:

@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 {

You'll then need to annotate each individual property mapped to TRAINERS table with @Column(table="TRAINERS") to specify which table it belongs to. If you're using XML mappings instead, all of the above can be done via join element.

All that said, it seems to me that your two tables are rather different in nature and should not be mapped to a single class (especially since you've said you've already mapped ROOMS elsewhere). Perhaps you should map your Trainer as ManyToOne association instead.

这篇关于Hibernate将两个表映射到一个类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆