2010-02-04 139 views
1

我對使用Java和Hibernate的對象關係映射有一個奇怪的難題。不尋常的Hibernate繼承映射

我們有一個現有的模式,它看起來是這樣的:

create table foo (id int8, /* ... */ primary key (id)); 
create table bar (id int8, foo int8, /* ... */ primary key (id)); 
alter table bar add constraint fk_foobar foreign key (foo) references foo; 

通常情況下,你會使用ManyToOne關係映射此。

class Foo { /* ... */ } 
class Bar { private Foo foo; /* ... */ } 

但在我的球隊裏的朋友想這映射到繼承關係:

class Foo { /* ... */ } 
class Bar extends Foo { /* ... */ } 

有沒有辦法使用Hibernate拉這一關?

編輯:重要的一點是,該表bar有一個外鍵列foo,這是從bar的標識列不同。

+0

我使用NHibernate的(休眠的端口)與C#,答案是肯定的。在NHibernate文檔中有一些例子,我確定Hibernate – David 2010-02-04 16:25:38

+0

也存在相同的問題嗎?請提供反饋。 – Bozho 2010-02-11 12:38:15

+0

我很確定答案是否定的。我敢打賭,Hibernate是硬連線的,所以如果你有繼承關係,派生類表中的主鍵必須是基類表的外鍵。 – leedm777 2010-03-08 06:20:41

回答

0

你應該只圖這是一種繼承關係,如果酒吧富。否則,你應該使用構圖。 但是,offcourse,我不知道上下文,所以我不知道是否將這些類映射爲子類和基類是正確的。

無論如何,是的,這是可能的。 檢查the different possibilities to create an inheritance relationship in Hibernate.

例如,你可以使用連接子類的場景在這裏:

<class name="Foo" table="Foos"> 
    <joined-subclass="Bar" table="Bars"> 
    </joined-subclass> 
</class> 
+0

實際使用情況是灰色區域。 Bar提供有關Foo的其他數據。那樣的話,你可以把它看作Bar-a Foo。但可能有多個對象提供有關同一Foo的附加數據。這更傾向於Bar has-a Foo。 您提供的映射不映射到現有模式。條形表具有與foo外鍵列不同的id列。 – leedm777 2010-02-04 16:37:52

+2

這是我的作品,因爲它是一對多的。對於同一個使用繼承的Foo,不能有多個Bars。考慮所有「附加信息」對象的繼承映射。 – zoidbeck 2010-02-04 16:58:49

0
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class Foo { .. } 

但做到這一點,只有當它是邏輯是繼承。即如果是Dog extends Animal,而不是在情況下,它是User extends Group