我有许多由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());
您可以尝试一些选项。
-
转换输入。POJO 到 db。波乔。
a. 手动转换呼叫获取器和设置器。
b. 使用推土机或类似工具。
-
[在这种情况下没有用]你可以直接在实体中使用doSomething()方法
。
我会做 1 (b)
详情 1. :创建输入对象。POJO 对象 1(非实体)并将所有值映射到 db 的对象。POJO 对象 2(实体)。
例:
object2.setAtt1(object1.getAtt1());
object2.setAtt2(object1.getAtt2());
现在您将 object2 传递给 session.save(object2);它应该有效。
您可以使用推土机,它将自动将值从一个对象复制到另一个对象