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

时间:2016-02-04 10:22:35

标签: hibernate

我有许多由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识别演员阵容?或者应该通过其他方式实现这一目标?

2 个答案:

答案 0 :(得分:1)

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

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

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 :(得分:0)

您可以尝试一些选项。

  1. 将input.POJO转换为db.POJO。

    一个。手动变换调用getter和setter。

    湾使用Dozer或类似工具。

  2. [在此方案中无用]您可以直接在实体中使用doSomething()方法

  3. 我会做1(b)

    有关1的详细信息。: 您创建input.POJO object1(非实体)的对象,并将所有值映射到db.POJO object2(Entity)的对象。

    示例:

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

    现在将object2传递给session.save(object2);它应该工作。

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