我有一個用hibernate註釋映射的用戶對象,它工作得很好。MappingException:使用實體子類作爲命令時的未知實體
例如
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
etc ..
}
我然後有使用Spring 3 MVC一個「添加用戶」形式和我所需的命令對象來支持這一形式,所以在子類UserCommand用戶從上方。用戶命令有一些額外的東西在網絡界面等相關,不需要保存爲用戶實體的一部分。
如
public class UserCommand extends User {
private String initialAddress;
etc
}
所以,我的看法/表示層基本上創建了一個UserCommand對象,填寫用戶信息,然後控制器提交下來到服務/ DAO層堅持。由於UserCommand擴展(「is-a」)用戶,dao接受UserCommand實例並通過dao驗證檢查(例如確保填寫了用戶名和密碼)。
然而,當hibernate實際上將對象作爲一個實體存在於數據庫中時,它似乎意識到實際的對象是一個UserCommand,它不是映射的實體,即使它是超級類型。
由此產生的錯誤是;
org.hibernate.MappingException: Unknown entity: com.example.UserCommand
org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:691)
org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1494)
org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:202)
org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:531)
org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:102)
org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
有沒有辦法解決這個問題?我似乎是一個明顯的事情要做,表單填寫一個用戶,所以只需使用User(即UserCommand)的擴展作爲表單的後備命令對象。
或者我將不得不打破繼承,複製UserCommand中的用戶的字段,並在表單提交時顯式複製UserCommand中的所有值到用戶?