我必须制作拼贴项目的域层。 我们有很少的标准,比如我们必须使用Hibernate,数据库也是修复的。
数据库的相关部分看起来几乎是这样的:
BusEntitys (表1)
BusType (表2)
我遇到的问题是域层中有两种类型的总线由BusType-table中的鉴别器区分:
@Entity
class Bus
{
@Id
int _id;
...
}
@Entity
class BusSubClass1 extends Bus
{
...
}
@Entity
class BusSubClass2 extends Bus
{
...
}
有没有办法用Hibernate和JPA映射这样的东西? 谢谢你的每一个答案。
Jochen Morent
答案 0 :(得分:2)
是的,有几种方法可以映射这种情况。 JPA为三种不同的数据表示提供支持:
换句话说,根据使用的继承类型,您将获得不同的数据库模型。各种JPA提供者可能支持其他继承策略。
考虑以下示例:
@Entity
@Inheritance //by default SINGLE_TABLE strategy
@DiscriminatorColumn( //not supported for TABLE_PER_CLASS strategy
name = "BUS_TYPE",
discriminatorType = DiscriminatorType.INTEGER
)
public abstract class Bus {
@Id
protected int id;
protected int seats;
public Bus() {
}
}
@Entity
@DiscriminatorValue(value = "1") //not supported for TABLE_PER_CLASS strategy
public class BusSubClass1 extends Bus {
private String specific1;
public BusSubClass1() {
}
}
@Entity
@DiscriminatorValue(value = "2") //not supported for TABLE_PER_CLASS strategy
public class BusSubClass2 extends Bus {
@Temporal
private Data specific2;
public BusSubClass2() {
}
}
使用InheritanceType.SINGLE_TABLE
策略会导致包含所有具体实体类型的单个数据库表:
Bus
ID BUS_TYPE SEATS SPECIFIC1 SPECIFIC2
-- -------- ----- --------- ---------
1 1 50 qwerty
2 1 55 asdfgh
3 2 30 2014-01-01
使用InheritanceType.JOINED
策略会导致每个实体类型有多个数据库表(来自Bus
的所有共享字段都存储在相应的表中):
Bus BusSubClass1 BusSubClass2
ID BUS_TYPE SEATS ID SPECIFIC1 ID SPECIFIC2
-- -------- ----- -- --------- -- ---------
1 1 50 1 qwerty 3 2014-01-01
2 1 55 2 asdfgh
3 2 30
使用InheritanceType.TABLE_PER_CLASS
策略可以为每个实体类型提供一个数据库表(来自Bus
的所有共享字段在具体子类中重新定义):
BusSubClass1 BusSubClass2
ID SEATS SPECIFIC1 ID SEATS SPECIFIC2
-- ----- --------- -- ----- ---------
1 50 qwerty 3 30 2014-01-01
2 55 asdfgh