0

我有一个如下所示的表层次结构:

@MappedSuperclass
@Table(name = "v_contract_account", schema = "SAP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@XmlRootElement
@XmlSeeAlso({CurrencyAccount.class, ProgramAccount.class})
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class AbstractContractAccount implements Serializable {
    ....
}

@Entity
@Table(name = "v_contract_account", schema = "SAP")
@Immutable
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("0")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class CurrencyAccount extends AbstractContractAccount  {
    ...
}

@Entity
@Table(name = "v_contract_account", schema = "SAP")
@Immutable
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("1")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ProgramAccount extends AbstractContractAccount {
    ...
}

现在它按原样工作(除了鉴别器的东西),但为什么如果我从子类中删除表注释,Hibernate 会抛出异常?

org.jboss.resteasy.spi.UnhandledException: java.lang.ClassCastException: org.jboss.resteasy.specimpl.BuiltResponse cannot be cast to [Lcom.zanox.internal.billingmasterdata.domain.entity.CurrencyAccount;

而且奇怪的是,如果我不把表和继承注解放在抽象超类中,一切照样正常。这是否意味着 MappedSuperClass 不关心表和继承注释?如果注释 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 在任何地方都不需要,那么我在哪里指定它?

顺便说一句,在我这里,Hibernate 不会创建表,表已经存在,我只想映射它。

4

1 回答 1

1

您可能希望从父实体中删除 @MappedSuperClass 注释并使其成为普通实体。

http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

如果您想通过 AbstractContractAccount 进行查询,那么它必须是一个实体。当它是 MappedSuperclass 时,您不能这样做。

当您想定义一些常见的映射但没有实际的“数据库继承”时,您将使用 @MappedSuperClass。

http://en.wikibooks.org/wiki/Java_Persistence/Inheritance

映射超类继承允许在对象模型中使用继承,当它在数据模型中不存在时。它类似于按类继承的表,但不允许查询、持久化或与超类建立关系。其主要目的是允许其子类继承映射信息。子类负责定义表、id 和其他信息,并且可以修改任何继承的映射。映射超类的一个常见用法是为您的应用程序定义一个通用 PersistentObject 来定义通用行为和映射,例如 id 和版本。映射的超类通常应该是抽象类。映射的超类不是实体,而是通过 @MappedSuperclass 注释或元素定义的。

于 2013-11-08T16:00:17.870 回答