java - 映射异常 : Unknown entity when using Entity subclass as Command

标签 java spring hibernate spring-mvc spring-3

我有一个使用 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/

相关文章:

hibernate - 扩展域类导致奇怪的表布局和不可访问的字段

java - Android 中多色列表的列表选择器

c# - 最佳实践/良好编码技术的文献建议

java - Spring MongoDB - 为什么唯一索引也应用于嵌入文档?

java - 使用 spring 查询方法出现意外的空结果

java - Spring 测试服务类模拟实用程序类- Junit 和 Mockito

java - 返回一个在 for 循环中被 st 的整数

java - 如何使用 java Process 知道文件是否已关闭

使用运行模式 validator 启动 Hibernate 时速度很慢

java - 使用 JPA Hibernate 而不使用 Spring 的多个数据库