作为一个新的Hibernate用户,我听说向生成的类中添加一些辅助方法的好方法是将它们添加到子类中。例如:映射休眠“自定义”子类
// generated via Hibernate mapping file
public class GeneratedClass {
long id;
String someValue;
// etc, etc.
}
// my own class with pretty printing method
public class MyGeneratedClass extends GeneratedClass {
public String prettyPrint() {
return "an object: " + id + "," + someValue;
}
}
我想做什么就能做的是以下几点:类型MyGeneratedClass代替GeneratedClass都Hibernate的回报对象,这样我可以与子类直接工作。映射文件是否可以用这种方式定义(即不用覆盖任何自定义代码)?
对于任何可能的解决方案,如果GeneratedClass是类层次结构(即扩展GeneratedClass的GeneratedClassTypeA,GeneratedClassTypeB)的一部分,该模式是否仍然有效?
我想一个替代方案是创建一个静态工厂方法从GeneratedClass创建MyGeneratedClass,但这对于大量对象来说似乎效率低下。
在此先感谢!
编辑
试图脱离联邦级的策略之后,我意识到它没有我的情况下工作,因为现有的类层次结构和数据。此外,我无法控制覆盖我的子类的一代(hbm2java中的一个理想功能?)。最后,我确实考虑过将代码嵌入到映射文件中,但是重写getter和setter等东西看起来很乏味。
我回顾了方法,决定去注释域对象并避免完全使用hbm2java。这并不完全理想(映射似乎更容易处理),但是从我从各种来源收集的信息来看,它可能是处理我特殊情况的最合适的方式,因为它使我可以自由地使用类型检查来自定义代码并只处理类文件。
我希望对我的解决方案有任何其他想法或意见。
编辑2
该溶液下文提议,使用
<meta attribute="generated-class">CountryBase</meta>
是一个很好的解决它最初描述的原始问题。 但是,我发现的是,具有对象层次结构和使用超类方法对于此解决方案不起作用,在这种情况下,注释似乎是更好的选择。
“使用基类”,在实施例的以上的上下文只是为了澄清,我会放<类名=“MyGeneratedClass> <! - ID映射,值属性 - > 并且GeneratedClass本身没有映射吗? 但是如果我从这个映射生成Java类,是不是会覆盖我写的任何自定义代码? – slau 2010-01-13 06:33:49
感谢您的代码片段。我发现当我插入它时到我现有的域对象层次结构中,union-subclass改变了数据库模式,因为我最初使用的是join-subclass(对不起,我没有早点指出过) - 所以这对我来说是一个很好的解决方案。我正在添加的课程是不是层次结构的一部分,但是当使用hbm2java时,它仍然有覆盖类的趋势。我搜索hbm2java控制参数没有成功;我想我正在考虑像EMF那样注释代码以防止覆盖的能力。 – slau 2010-01-19 17:50:59
另外,您不能使用Hibernate 3和注释来将映射和代码保持在一起吗?我发现配置文件非常方便。你是否也从映射中生成数据库模式? – ewernli 2010-01-19 18:52:05