Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Table per Concrete Class Hierarchy in Hibernate

I have the following Hibernate Mapping, which has to be mapped using the Table per Concrete Class Hierarchy:

<hibernate-mapping package='dao'>
    <meta attribute='class-description'></meta>
    <class name='PropertyDAO'>
        <id name='id' column='id_property'>
            <generator class='assigned'/>
        </id>
        <property name='address' column='address' type='string'/>
        <union-subclass name='HouseDAO' table='house'>
            <property name='noOfRooms' column='noOfRooms'/>
            <property name='totalArea' column='totalArea'/>
            <property name='price' column='price'/>
        </union-subclass>
        <union-subclass name='LandDAO' table='land'>
            <property name='area' column='area'/>
            <property name='unitPrice' column='unitPrice'/>
        </union-subclass>
    </class>
</hibernate-mapping>

Which means in the database i have only 2 tables :

  • house (id_property(PK), address, noOfRooms, totalArea, price)
  • land (id_property(PK), address, area, unitPrice)

As far as I understood, in this case the ids need to be generated explicitly before calling .save(), so my question is: How can I create a strategy for the automatically generation of the ids, so that the ids from the concrete class form a continuous domain when joined.

like image 967
melculetz Avatar asked Dec 04 '25 08:12

melculetz


1 Answers

IMHO your model in the DB is wrong as you have redundant information across multiple tables which are related.

Table per concrete class is an inheritance model which gives problems at runtime as you can have the situation where one updates the address of Land but not of House while they're the same (semantically). I.o.w.: drop this model and introduce table-per-subclass, so you have a property base table with id and address and two separated tables with a PK which is an FK to the pk of property base, one is house with the house specific fields, the other is land with the land specific fields.

That will give you the smallest number of problems as it's the way to convert inheritance between entity types to relational tables (see Nijssen/Halpin's books about NIAM/ORM)

like image 124
Frans Bouma Avatar answered Dec 07 '25 09:12

Frans Bouma



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!