Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常的Hibernate继承映射_Java_Hibernate_Orm_Jpa_Mapping - Fatal编程技术网

Java 异常的Hibernate继承映射

Java 异常的Hibernate继承映射,java,hibernate,orm,jpa,mapping,Java,Hibernate,Orm,Jpa,Mapping,使用Java和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

使用Java和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
的标识列

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

但只有在继承符合逻辑的情况下才能这样做。也就是说,如果是
狗扩展动物
,而不是
用户扩展组

如果Bar是一个Foo,您应该只将其映射为一个继承关系。否则,您应该使用组合。 但是,当然,我不知道上下文,所以我不知道将这些类映射为子类和基类是否正确

无论如何,是的,这是可能的。 检查

例如,您可以在此处使用连接的子类场景:

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


我将NHibernate(Hibernate端口)与C#一起使用,答案是肯定的。NHibernate文档中有一些例子,我确信Hibernate也有同样的例子。你解决问题了吗?请提供反馈。我很确定答案是否定的。我打赌Hibernate是硬连接的,因此如果您有继承关系,派生类表中的主键必须是基类表的外键。实际使用情况是灰色区域。Bar提供有关Foo的附加数据。这样的话,你可以把它看作是一个酒吧。但是可能有多个对象提供关于同一个Foo的附加数据。这更倾向于酒吧——一个Foo。您提供的映射没有映射到现有架构。bar表有一个id列,与foo外键列不同。这对我来说是一个组合,因为它是一对多。使用继承时,同一个Foo不能有多个条。考虑所有“附加信息”对象的继承映射。