2010-02-04 137 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