我必须制作一个拼贴项目的域层。我们几乎没有标准,例如我们必须使用Hibernate,数据库也已修复。
数据库的相关部分几乎如下所示:
总线实体 (表1)
总线类型 (表2)
我遇到的问题是,在域层中有2种类型的总线通过BusType表中的标识符进行区分:
@Entity class Bus { @Id int _id; ... } @Entity class BusSubClass1 extends Bus { ... } @Entity class BusSubClass2 extends Bus { ... }
有没有办法用Hibernate和JPA映射类似的东西?谢谢你的回答。
乔钦·莫伦特(Jochen Morent)
是的,几乎没有办法映射这种情况。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策略将导致一个包含所有具体实体类型的数据库表:
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都存储在相应的表中):
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都在具体的子类中重新定义):
InheritanceType.TABLE_PER_CLASS
BusSubClass1 BusSubClass2 ID SEATS SPECIFIC1 ID SEATS SPECIFIC2 -- ----- --------- -- ----- --------- 1 50 qwerty 3 30 2014-01-01 2 55 asdfgh