Hibernate将两个表映射到一个类 [英] Hibernate Mapping Two Tables to One Class
问题描述
我需要将两个表映射到一个类,无法解决这个问题。一张桌子是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
要将单个类映射到两个(或更多)单独的表,您需要使用 然后,您需要使用<$ c注释映射到 所有这一切说,在我看来,你的两张桌子本质上是不同的,不应该映射到一个类(特别是因为你已经说过你已经在别处映射了 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: TRAINERS table: Tables should be joined on Primary Key for ROOMS table is: I need to query this data by In SQL it might be something like: 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: You'll then need to annotate each individual property mapped to 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 这篇关于Hibernate将两个表映射到一个类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
@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 {
TRAINERS
表的每个单独属性$ c> @Column(table =TRAINERS)来指定它属于哪个表。如果您使用的是XML映射,则可以通过加入元素。
ROOMS
)。也许你应该将你的教练映射为 ManyToOne 关联。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
and OOC_START_TM=TRSC_OOC_START_TM
. OOC_UNIT_ID, OOC_START_DT, OOC_START_TM
. Primary Key for the TRAINERS table is: TRSC_ID
.OOC_UNIT_ID
, OOC_START_DT
, OOC_START_TM
, OOC_END_DT
, OOC_END_TM
and OOC_WSD_ACT_RMAT_ID
. 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 ...
@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
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.ROOMS
elsewhere). Perhaps you should map your Trainer as ManyToOne association instead.