2012-07-24 75 views
2

我有两个MySQL表,并希望他们与Hibernate映射:如何在Hibernate中使用一对一的关系做一个继承映射?

cars 
- Id 
- owner 

audis: 
- AudiId 
- model 

在代码:

@Entity 
@Table(name = "cars") 
public class Car{ 
    Integer id; 
    String owner; 
} 

@Entity 
@Table(name = "audis") 
public class Audi extends Car{ 
    String model; 
} 

我想有他们之间的加入主键,这样的audiId引用汽车表中的Id。 Ids应自动递增。

例子:

cars 
id: 1 owner: "John" 
id: 2 owner: "Jim" 
id: 3 owner: "Jake" 

audis 
audiId: 1 model: "A8" 
audiId: 3 model: "A6" 

什么是Hibernate来做到这一点的最好方法是什么?我必须添加哪些注释?哪些代码丢失(getter和setter除外)?

我发现这个主题很多教程很混乱,所以我会很感激任何帮助。

+1

在Hibernate中,你必须选择三种继承映射策略之一。从你的描述中,我认为“加入的子类”策略是你想要的:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch05.html#mapping-declaration-加入子类 – millimoose 2012-07-24 17:06:19

回答

0

试试类Car的注释@Inheritance(strategy=InheritanceType.JOINED)。您还可以使用@Id @GeneratedValue作为Id成员Car类。

Here是一个如何在hibernate中使用继承的例子。希望能帮助到你。

+0

如何指定为奥迪级别使用列名“AudiId”? – kadrian 2012-07-24 17:16:10

+0

@ ka2011r'@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)'你可以做到这一点。这样,每个类都有自己的表(这意味着在audis表中也会有一个Id)。但是这种模式在多态性方面有其缺点 – yohlulz 2012-07-24 17:21:33

+0

@yohlulz你能提供更多关于缺点的细节吗? – svlada 2015-04-19 20:26:49

0

您可以使用注释@Inheritance(strategy=InheritanceType.JOINED)在你的超类(汽车),并与@Id建立在你的车的id属性并将其标记为@GeneratedValue

然后,在你的子类中使用@PrimaryKeyJoinColumn(NAME =“car_id”)其中名称必须是在你的车超类的ID使用相同的名称。

@PrimaryKeyJoinColumn注释指定用作外键的主键列以连接到另一个表。

这是一个very easy example了解它。

+0

在父类型的查询期间是否可以避免与每个子类连接? – svlada 2015-04-19 20:25:53