我有一个表格层次结构如下所示:
@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不创建表,表已经存在,我只想映射它。
答案 0 :(得分: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注释或 元件。