我有一个使用 hibernate 注释映射的 User 对象,工作得很好。
例如
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
etc ..
}
然后我有一个使用 Spring 3 MVC 的“添加用户”表单,并且我需要一个命令对象来支持此表单,因此我在 UserCommand 中从上面的 User 子类化。 UserCommand 有一些与 Web 界面等相关的额外内容,不需要保存为用户实体的一部分。
例如
public class UserCommand extends User {
private String initialAddress;
etc
}
所以我的 View /表示层基本上创建了一个 UserCommand 对象,填写用户详细信息,然后 Controller 将其提交到服务/dao 层进行持久化。由于 UserCommand 扩展了(“is-a”)User,dao 接受 UserCommand 实例并通过了 dao 验证检查(例如,确保填写了用户名和密码)。
然而,当 hibernate 实际上将对象作为实体持久保存在数据库中时,它似乎意识到实际对象是一个 UserCommand,它不是一个映射实体,尽管它的父类(super class)型是。
产生的错误是;
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 中?
最佳答案
我认为混合数据库和 View 实体是一种不好的做法。这些是不同的层,它们应该在不同的 DTO 上运行。通常我使用以下模式在两层之间进行转换:
public class UserCommand {
public static UserCommand fromUser(User user) {
UserCommand command = new UserCommand();
// fill UserCommand fields
return command;
}
public void toUser(User user) {
// fill User fields
}
}
如果 View 和数据库 DTO 之间的转换需要一些复杂的逻辑,您可以将这些方法移至转换服务。
拆分这些实体的好处之一是验证。您可以指定 JSR-303 注释来验证这些 bean,并且在大多数情况下,它们对于 UI 和 DB 来说是不同的。
关于java - 映射异常 : Unknown entity when using Entity subclass as Command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842781/