我有一个子类和一个父类(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/