hibernate - 使用 Hibernate 将子类持久化为父类(super class)

标签 hibernate inheritance

我有一个子类和一个父类(super class)。但是,只需要持久化父类(super class)的字段。

session.saveOrUpdate((Superclass) subclass);

如果我执行上述操作,我将得到以下异常。
org.hibernate.MappingException: Unknown entity: test.Superclass
    at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:628)
    at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1366)
    at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:535)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:103)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
    at $Proxy54.saveOrUpdate(Unknown Source)

如何将子类持久化为父类(super class)?我不喜欢创建一个父类(super class)实例,然后从子类实例传递值。因为,如果将来在父类(super class)中添加额外的字段,很容易忘记更新逻辑。

最佳答案

这个问题有一种解决方案,它实际上在 StackOverFlow 上有介绍:

Hibernate/NHibernate : how to persist subclass as instance of superclass

Hibernate Documentation

本质上,您只需告诉 Hibernate 使用父类(super class)的字符串将您的类保存为父类(super class),例如:

session.save("my.superclass",subclass);

这可能不适用于所有用例,但对我来说这只是一张票。

关于hibernate - 使用 Hibernate 将子类持久化为父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3060511/

相关文章:

java - SQLGrammarException : ERROR: relation "angajat" does not exist

java - 嵌套 @Transactional(propagation = Propagation.REQUIRES_NEW) 是否创建新的 Hibernate session ?

java - 错误 : javax. persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey 与 Spring Controller

c++ - 什么是在 C++ 中重载构造函数的正确而优雅的方法

c++ - 了解一个简单的 C++ 类结构

java - 如何对这个类进行类型转换?

mysql - 计算实体,在 Doctrine2 中?

java - WildFly 14 - java.lang.ClassCastException : org. dom4j.DocumentFactory 无法转换为 org.dom4j.DocumentFactory

java - Hibernate 标准 - org.hibernate.QueryException : could not resolve property:

c# - 自动使基构造函数在派生类中可用?