Hibernate Mapping Two Tables to One Class

前端 未结 4 1527
梦毁少年i
梦毁少年i 2020-12-09 23:40

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         


        
相关标签:
4条回答
  • 2020-12-09 23:57

    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.

    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.

    0 讨论(0)
  • 2020-12-10 00:10

    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.

    0 讨论(0)
  • 2020-12-10 00:12

    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.

    public class Trainer extends Room {
      ...
    }
    

    Then I modified the mapping for ROOM to include a 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

    0 讨论(0)
  • 2020-12-10 00:16

    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.

    0 讨论(0)
提交回复
热议问题