【问题标题】:How to do an inheritance mapping in Hibernate with a one-to-one relationship?如何在 Hibernate 中进行具有一对一关系的继承映射?
【发布时间】:2012-07-23 01:28:42
【问题描述】:

我有两个 MySQL 表,想用 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。 ID 应自动递增。

例子:

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

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

使用休眠的最佳方法是什么?我必须添加哪些注释?缺少哪些代码(getter 和 setter 除外)?

我发现很多关于这个主题的教程非常令人困惑,所以我将不胜感激。

【问题讨论】:

标签: java mysql hibernate inheritance one-to-one


【解决方案1】:

试试@Inheritance(strategy=InheritanceType.JOINED)Car 的注释。您也可以将@Id @GeneratedValue 用于Id Car 类的成员。

Here 是一个如何使用 hibernate 继承的例子。希望对您有所帮助。

【讨论】:

  • 那么我如何指定为奥迪类使用列名“AudiId”?
  • @ka2011r 和@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 你可以这样做。这样,每个类都有自己的表(这意味着audis 表中也会有一个 Id)。但是这种模式在多态性方面有其缺点
  • @yohlulz 你能提供更多关于缺点的细节吗?
【解决方案2】:

您可以在您的超类 (Car) 中使用注解 @Inheritance(strategy=InheritanceType.JOINED),并使用 @Id 在您的 Car 中创建一个 id 属性并将其标记为 @GeneratedValue

然后,在您的子类中使用 @PrimaryKeyJoinColumn(name="car_id"),其中名称必须与您的 Car 超类的 id 中使用的名称相同。

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

这里是very easy example 了解它。

【讨论】:

  • 在查询父类型时是否可以避免与每个子类连接?
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2017-12-07
  • 2011-11-22
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多