org.hibernate.MappingException:具有派生类的未知实体



我有许多由Hibernate的逆向工程功能自动生成的POJO。它们看起来像:

package db;
/**
 * Pojo generated by hbm2java
 */
public class Pojo implements java.io.Serializable 
{
    private int id;
    public Pojo() {
    }
    public Pojo(int id) {
        this.id = id;
    }
    public int getId() {
        return this.id;
    }
    public void setId(int id) {
        this.id = id;
    }
}

我需要对其中一些 POJO 做各种事情,从而创建派生类,例如:

package input;
public class Pojo extends db.Pojo
{
    public Pojo() 
    {
        // TODO Auto-generated constructor stub
        super();
    }
    public void doSomething()
    {}
}

在某些时候,我需要使用 Session 对象存储这些 POJO 的新实例:

input.Pojo pj = new input.Pojo();
pj.doSomething();
session.save((db.Pojo) pj);

即使 POJO 实例被强制转换为生成的父类,Hibernate 也会感到不安并吐出熟悉的异常:

Exception in thread "main" org.hibernate.MappingException: Unknown entity: input.Pojo

我知道我可能会稍微推动Hibernate,但我更愿意保持生成的POJO不变(特别是因为数据库有望发展)。是否可以避免此异常?比如说,通过"强迫"冬眠来识别演员阵容?还是应该以其他方式实现?

我已经在Hibernate论坛和IRC频道上讨论了这个问题,到目前为止还没有适当的机制来平息这个异常。Hibernate似乎不是为了处理这种明显不常见的情况而设计的。

在这种特殊情况下,我可以通过组合来解决继承模式。这可能不适合所有类似情况,但可以完全重用代码,而不会加剧其他维护问题。

然后,input类如下所示:

package input;
public class Pojo
{
    public Pojo() 
    {
        pojo = new db.Pojo();
    }
    protected db.Pojo pojo;
    public db.Pojo getPersistentObject() {return pojo;}
    public void doSomething()
    {}
}

用法是这样的:

input.Pojo pj = new input.Pojo();
pj.doSomething();
session.save(pj.getPersistentObject());

您可以尝试一些选项。

  1. 转换输入。POJO 到 db。波乔。

    a. 手动转换呼叫获取器和设置器。

    b. 使用推土机或类似工具。

  2. [在这种情况下没有用]你可以直接在实体中使用doSomething()方法

我会做 1 (b)

详情 1. :创建输入对象。POJO 对象 1(非实体)并将所有值映射到 db 的对象。POJO 对象 2(实体)。

例:

object2.setAtt1(object1.getAtt1());
object2.setAtt2(object1.getAtt2());

现在您将 object2 传递给 session.save(object2);它应该有效。

您可以使用推土机,它将自动将值从一个对象复制到另一个对象

最新更新