2016-07-26 7 views
0

Ich habe zwei Tabellen - Table1 und Table2. Die Datenstruktur beider Tabellen ist gleich. Ich habe einzelne VO für beide Table1 und Table2. Ich habe zwei .hbm.xml-Datei für zwei Tabellen separat - Table1.hbm.xml und Table2.hbm.xmlHibernate: Map einzelnen VO zu zwei Tabellen

In meinem Java-Code, basierend auf einem Zustand entweder muß ich Table1 oder Table2

if(someCondition) 
{ 
session.saveOrUpdate(VO); //This should be for Table1 
} 
else 
{ 
session.saveOrUpdate(VO); //This should be for Table2 
} 

Mein Problem sparen, da die VO Gleiches gilt für die Entscheidung, welche Tabelle gespeichert werden soll.

Ist es möglich, denselben VO zu zwei Tabellen zugeordnet zu haben?

Hinweis: Der Grund, warum ich eine solche Anforderung habe, ist Tabelle1 und Tabelle2 sind in separaten Tablespace. Einer ist partitioniert und der andere nicht. Es gibt ein paar andere Gründe für solch eine seltsame Anforderung, die außerhalb meiner Kontrolle liegt, die Architektur jetzt zu ändern.

+0

Nein. Sie haben keine Vererbung auf Datenbankebene, daher benötigen Sie eine MapperSuperclass: 2 Entity-Klassen, die alle allgemeinen Felder dieser MappedSuperclass erben können. https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Mapped_Superclasses –

Antwort

0

Meiner Meinung nach mit zwei Entity Managern ist ein bisschen zu viel. Was Sie brauchen, ist eine gute Abstraktion am Tisch.

Sie können dieselbe Klasse beliebig oft zuordnen, müssen Sie sie nur unter einem anderen Namen zuordnen.

Als ein gutes Repository-Muster arbeitet mit der abstrakten Einheit (anstelle der konkreten) in Kombination mit einem Factory oder Builder, um die beiden Objekte zu erzeugen, wird die Arbeit erledigt. Wenn Sie diesem Ansatz folgen, müssen Sie diesen IF-ELSE-Fluss nicht haben.

Dann können Sie Repository arbeiten mit AbstractMappedSomeTimes Typen von Objekten. Sie können auch eine Factory erstellen, die entweder MappedOnce-Objekte oder MappedTwise-Objekte generiert.

+0

Wenn ich dieselbe Klasse unter verschiedenen Namen erstelle, dann wird es viele Stellen geben, an denen ich meinen Code ändern muss. ZB in Getter und Setter muss ich zuerst überprüfen, von welchem ​​VO ich abrufen und dann Instanz dieser bestimmten Entität erstellen muss. – user2488578

+0

Nein, du wirst nicht immer mit der abstrakten Klasse arbeiten! Nur zum Zeitpunkt der Erstellung verwenden Sie den Factory/Builder, um die tatsächliche Instanz zu erstellen. –