我有以下课程:

AbstractEntity,这是我所有实体的超类,并存储所有实体使用的公共字段,例如id:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
...
}


AbstractUser,它是所有用户实体(admin,standard等)的超类,并存储所有用户帐户通用的字段,例如登录名和密码等:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractUser extends AbstractEntity implements Serializable


非抽象用户类的示例AdminUser:

@Entity
public class AdminUser extends AbstractUser implements Serializable {


我想拥有的一个表是AbstractUser类,该表仅包含AbstractUser类中的列,然后是每个子类的ONE表,其中包含所有类的特定值。我认为AbstractUser中的@Inheritance(strategy = InheritanceType.JOINED)批注应该这样做。但是,Hibernate为我生成了一个架构,其中每个类都有一个表(AbstractUser和扩展它的所有类),而非抽象类的表则包含抽象类的所有列。

当我保留扩展AbstractUser的类之一的对象时,所有值都将写入更特定的表,即AbstractUser表保持为空。

澄清:
说我有一个AbstractUser类以及扩展AbstractUser的AdminUser和StandardUser类。然后我保留一个ID为1且名称为“ A”的AdminUser对象,并保留一个ID为2的名称为“ B”且帐号为“ 001”的StandardUser,最终会得到以下结果:

抽象用户:

| ID | NAME |
empty table


管理员用户:

| ID | NAME |
|  1 |   A  |


标准用户:

| ID | NAME | AccountNum |
|  2 |   B  |     001    |


我想得到的是:

抽象用户:

| ID | NAME |
|  1 |   A  |
|  2 |   B  |


管理员用户:

| ForeignKey |
|      1     |


标准用户:

| ForeignKey | AccountNum |
|      2     |     001    |


我使用的注释出了什么问题?我该如何实现?

以防万一,我的persistence.xml:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="cfadbPU" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/cfadbDS</jta-data-source>
<properties>
  <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/cfadb"/>
        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
        <property name="hibernate.connection.username" value="*****"/>
        <property name="hibernate.connection.password" value="*****"/>
        <property name="hibernate.default_schema" value="public"/>
        <property name="hibernate.connection.autocommit" value="false"/>
        <property name="hibernate.enable_lazy_load_no_trans" value="true"/>
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
  </properties>
 </persistence-unit>
</persistence>


更新:

我浏览了服务器日志并看到了以下消息:

 WARN  [org.hibernate.cfg.AnnotationBinder] (ServerService Thread Pool -- 187) HHH000138: Mixing inheritance strategy in a entity hierarchy is not allowed, ignoring sub strategy in: entities.users.AbstractUser
 WARN  [org.hibernate.cfg.AnnotationBinder] (ServerService Thread Pool -- 187) HHH000137: Root entity should not hold an PrimaryKeyJoinColum(s), will be ignored
 WARN  [org.hibernate.cfg.AnnotationBinder] (ServerService Thread Pool -- 187) HHH000137: Root entity should not hold an PrimaryKeyJoinColum(s), will be ignored


是否存在错误混合继承策略,因为我首先对AbstractEntity使用TABLE_PER_CLASS,然后对AbstractUser使用JOINED?如果这是导致错误的原因,为什么不允许混合继承类型?我不知道那怎么可能引起任何问题?

最佳答案

AbstractEntity应该是MappedSuperclass,而不是Enity。

http://en.m.wikibooks.org/wiki/Java_Persistence/Inheritance#Mapped_Superclasses


  映射的超类继承允许在
  对象模型(如果数据模型中不存在对象模型)。


@MappedSuperclass
public abstract class AbstractEntity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
...
}

10-06 00:54