我有许多由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识别演员阵容?或者应该通过其他方式实现这一目标?
答案 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)
您可以尝试一些选项。
将input.POJO转换为db.POJO。
一个。手动变换调用getter和setter。
湾使用Dozer或类似工具。
[在此方案中无用]您可以直接在实体中使用doSomething()方法
我会做1(b)
有关1的详细信息。: 您创建input.POJO object1(非实体)的对象,并将所有值映射到db.POJO object2(Entity)的对象。
示例:
object2.setAtt1(object1.getAtt1());
object2.setAtt2(object1.getAtt2());
现在将object2传递给session.save(object2);它应该工作。
您可以使用dozer,它可以自动将值从一个对象复制到另一个对象