没有附加表的JPA实体继承

时间:2015-10-15 15:56:21

标签: java spring hibernate maven jpa

我正在开发基于Spring,JPA和Hibernate的Maven Java Web项目。

该项目的一部分应在另一个非常相似的项目中重复使用,因此被提取为Maven模块。此服务和相应的实体注释如下:

@Entity
public class TypeAUser
@Entity
public class TypeBUser

两个项目都有相似但略有不同的UserEntities。

adb shell dumpsys battery set ac 1

Message Entity与每个项目中的一个UserEntities有@OneToMany关系。

我考虑过一般的UserEntity,但是想避免创建其他表以及包含“其他”项目字段的表。

任何想法都表示赞赏。

祝你好运, 斯蒂芬

2 个答案:

答案 0 :(得分:2)

如果您不想创建其他表格,那么您可能需要考虑使用SINGLE_TABLE strategy.

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class UserEntity {
...
}

@Entity
public class TypeAUser extends UserEntity {
...
}

@Entity
public class TypeBUser extends UserEntity {
...
}

答案 1 :(得分:1)

好吧,在谈论Hibernate中的继承时,你有三个选择:

  1. 每个具有工会的具体课程表
  2. 每个类层次结构的表(单表策略)
  3. 每个子类的表
  4. 由于您希望使用一个表来实现它,我建议使用选项2。

    您只需要一个User表,USER_TYPE列可以区分用户类型(可以是数字,varchar2等)

    然后,您需要使用以下注释创建一个用户类: 如果需要,可以指定DiscriminatorColumn,否则Hibernate将默认为'{className}_TYPE

    @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="USER_TYPE", discriminatorType=DiscriminatorType.STRING) public class User { .... }

    在具体的类实现中,您可以指定一个Discriminator值(如果不这样做,hibernate会将其默认为类名('TypeAUser'/ 'TypeBUser')

    @Entity @DiscriminatorValue('A') public class TypeAUser @Entity @DiscriminatorValue('B') public class TypeBUser