Hibernate将两个表映射到一个类

时间:2022-09-21 22:53:00

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.

表应该在OOC_UNIT_ID=TRSC_OOC_UNIT_ID, OOC_START_DT=TRSC_OOC_START_DT, 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.

ROOMS表的主键是:OOC_UNIT_ID、OOC_START_DT、OOC_START_TM。训练器表的主键是: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.

我需要通过OOC_UNIT_ID、OOC_START_DT、OOC_START_TM、OOC_END_DT、OOC_END_TM和OOC_WSD_ACT_RMAT_ID查询这些数据。

In SQL it might be something like:

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

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?

我正在项目的其他地方使用ROOMS表,它已经被映射为一个独立的对象。有没有一种方法可以将它用作训练器对象上的子对象,或者更容易将这两个表映射到一个平面对象中?映射会是什么样子?

Thanks, Nick

谢谢你,尼克

4 个解决方案

#1


6  

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

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

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.

然后需要使用@Column(表=“trainer”)注释映射到trainer表的每个属性,以指定它属于哪个表。如果您使用的是XML映射,那么以上所有操作都可以通过join元素完成。

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.

尽管如此,在我看来,您的两个表在本质上是相当不同的,不应该映射到单个类(尤其是因为您已经在其他地方映射了房间)。也许你应该把你的训练师和一个协会联系起来。

#2


1  

Solution I've come up with seems to be working as far as querying data, I haven't tried any insert/update/delete yet.

我提出的解决方案好像是在查询数据,我还没有尝试任何插入/更新/删除。

I created the TRAINER object to extend the ROOM object.

我创建了TRAINER对象来扩展房间对象。

public class Trainer extends Room {
  ...
}

Then I modified the mapping for ROOM to include a joined-subclass:

然后我修改了房间的映射,包括一个joined-subclass:

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

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

So far it appears to be working.

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

Thanks,

谢谢,

Nick

尼克

#3


0  

In my experience simplicity is key when using any ORM including Hibernate. I would create a database view based on your SQL lets call that TRAINERS_ROOMS then simple map that database view to a new Java object lets call that TrainersRooms.

根据我的经验,使用任何ORM(包括Hibernate)时,简单性都是关键。我将基于SQL let调用TRAINERS_ROOMS创建一个数据库视图,然后简单地将数据库视图映射到一个新的Java对象,让我们调用TrainersRooms。

You get simple easy to manager hibernate mappings, but of course you can perform any updates using this new object so if you need that, this solution won't work out for you.

您可以轻松地管理hibernate映射,但是当然您可以使用这个新对象执行任何更新,因此如果您需要的话,这个解决方案对您来说是行不通的。

#4


0  

You can create a named query that is binded to a custom object. This is the solution I would go with, since no changes to the DB would be necessary.

可以创建绑定到自定义对象的已命名查询。这是我要使用的解决方案,因为不需要修改DB。

#1


6  

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

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

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.

然后需要使用@Column(表=“trainer”)注释映射到trainer表的每个属性,以指定它属于哪个表。如果您使用的是XML映射,那么以上所有操作都可以通过join元素完成。

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.

尽管如此,在我看来,您的两个表在本质上是相当不同的,不应该映射到单个类(尤其是因为您已经在其他地方映射了房间)。也许你应该把你的训练师和一个协会联系起来。

#2


1  

Solution I've come up with seems to be working as far as querying data, I haven't tried any insert/update/delete yet.

我提出的解决方案好像是在查询数据,我还没有尝试任何插入/更新/删除。

I created the TRAINER object to extend the ROOM object.

我创建了TRAINER对象来扩展房间对象。

public class Trainer extends Room {
  ...
}

Then I modified the mapping for ROOM to include a joined-subclass:

然后我修改了房间的映射,包括一个joined-subclass:

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

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

So far it appears to be working.

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

Thanks,

谢谢,

Nick

尼克

#3


0  

In my experience simplicity is key when using any ORM including Hibernate. I would create a database view based on your SQL lets call that TRAINERS_ROOMS then simple map that database view to a new Java object lets call that TrainersRooms.

根据我的经验,使用任何ORM(包括Hibernate)时,简单性都是关键。我将基于SQL let调用TRAINERS_ROOMS创建一个数据库视图,然后简单地将数据库视图映射到一个新的Java对象,让我们调用TrainersRooms。

You get simple easy to manager hibernate mappings, but of course you can perform any updates using this new object so if you need that, this solution won't work out for you.

您可以轻松地管理hibernate映射,但是当然您可以使用这个新对象执行任何更新,因此如果您需要的话,这个解决方案对您来说是行不通的。

#4


0  

You can create a named query that is binded to a custom object. This is the solution I would go with, since no changes to the DB would be necessary.

可以创建绑定到自定义对象的已命名查询。这是我要使用的解决方案,因为不需要修改DB。