hibernate two tables per one entity
Preface:
This is a widely asked question even on SO, and also widely the answers are related to Subclass
or actually SuperClass
approach (e.g. [1])
Actual answer:
On these posts [2], [3] they suggest to use a xml mapping with EntityName
parameter.
So, mapping with xml you don't need superclass, just give the EntityName
parameter to two identical mappings.
Example Mapping:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DomainModel.User, DomainModel"
table="User1Object" entity-name="User1Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
<class name="DomainModel.User, DomainModel"
table="User2Object" entity-name="User2Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
</hibernate-mapping>
Then depending on which type of entity you need you call the appropriate session methods as:
_session.Save("User1Object", user1)
or
_session.Save("User2Object", user2)
Posts 2 & 3 were used as a basis for this snippet. Official source [4]
After match:
One answer on the first question which is actually link to this post [5] there is different approach:
You say bye to the first instance of the object, clone the data to fresh instance and persist that with different name. Thus, no violation on Hibernate logic and everybody content: same data at two tables and no sub-classes used.
Well, the implementation or code or credibility of that approach is so and so, I haven't tested it neither.
Another case:
In this post [6] there is another person trying to challenge the super class approach with something simpler, but again, the most credible answer states it is not possible another way around, the official non-xml approach is the said subclass approach.
Sources
[1] How to map one class to different tables using hibernate/jpa annotations
[2] Map Two Identical tables ( same schema...) to same entity in Hibernate
[3] How to map 2 identical tables (same properties) to 1 entity
[4] http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname
[5] Hibernate 4: One class mapping Two tables - How to persist one object on both tables?
[6] Hibernate Annotation for Entity existing in more than 1 catalog
Also it works using a default entity and an alternative one:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DomainModel.User, DomainModel"
table="User1Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
<class name="DomainModel.User, DomainModel"
table="User2Object" entity-name="User2Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
</hibernate-mapping>
For the default one, you can use the method
_session.Save(user1)
and
_session.Save("User2Object", user2)
for the alternative one.