HibernateアノテーションでマップされたUserオブジェクトが正常に機能しています。
例えば
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
etc ..
}
次に、Spring 3 MVCを使用した「ユーザーの追加」フォームがあり、このフォームをバックアップするためにコマンドオブジェクトが必要だったため、UserCommandでユーザーを上からサブクラス化しました。UserCommandには、ユーザーエンティティの一部として保存する必要のないWebインターフェイスなどに関連するいくつかの追加機能があります。
例えば
public class UserCommand extends User {
private String initialAddress;
etc
}
したがって、私のビュー/プレゼンテーション層は基本的にUserCommandオブジェクトを作成し、ユーザーの詳細を入力してから、コントローラーがこれをservice/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)
この問題を回避する方法はありますか?フォームはユーザーに入力しているので、フォームのバッキングコマンドオブジェクトとしてユーザーの拡張機能(つまり、UserCommand)を使用するだけです。
または、継承を解除し、UserCommandでUserのフィールドを複製し、フォームの送信中にUserCommandからUserにすべての値を明示的にコピーする必要がありますか?