2010-01-12 128 views
0

作为一个新的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> 

是一个很好的解决它最初描述的原始问题。 但是,我发现的是,具有对象层次结构和使用超类方法对于此解决方案不起作用,在这种情况下,注释似乎是更好的选择。

回答

1

我想做什么就能做的是 如下:具有Hibernate的返回类型的 对象MyGeneratedClass 代替GeneratedClass让我 可直接与子类的工作。 这样可以在 中定义映射文件吗?

是的,你只需要在映射中指定你的子类:<class name="Subclass" table="table">。然后你使用Subclass.class来查询实体。

对于任何可能的解决方案,如果 GeneratedClass是一个类分层结构 (即GeneratedClassTypeA, GeneratedClassTypeB两者延伸 GeneratedClass)的一部分,将这种模式仍然 工作?

是的。只要映射中定义的属性存在于类中(因为继承),它就可以工作。

我想一个替代方案是 创建一个静态工厂方法来 从 GeneratedClass创建MyGeneratedClass,但这似乎 低效大量 对象。

确实。

编辑

我不是从你生成的类出的映射你的问题的理解。我认为它是从其他模型中产生的,它会吐出映射和类。您的评论澄清了这一点。然后我会尝试使用hibernate inheritance的方法:

<class name="GeneratedClass" abstract="true"> 
    <id name="id" type="long" column="XXX"> 
     <generator class="sequence"/> 
    </id> 
    <property name="zzzz" column="ZZZZ"/> 
    ... 
    <union-subclass name="SubClass" table="TABLE"> 
    </union-subclass> 
</class> 

我没有测试上面的代码片段,但我相当确信,你的情况可以映射的一种方式或其他。 abstract=true可能是多余的,但它显示了父级超类不应该实例化的事实。该子类没有附加属性,所以subclass标签为空。

EDIT 2

你也<meta attribute="generated-class">CountryBase</meta>尝试一下呢?从来没有使用过它,但它似乎符合这个目的。参见Hibernate Class Generation with hbm2java

+0

“使用基类”,在实施例的以上的上下文只是为了澄清,我会放<类名=“MyGeneratedClass> <! - ID映射,值属性 - > 并且GeneratedClass本身没有映射吗? 但是如果我从这个映射生成Java类,是不是会覆盖我写的任何自定义代码? – slau 2010-01-13 06:33:49

+0

感谢您的代码片段。我发现当我插入它时到我现有的域对象层次结构中,union-subclass改变了数据库模式,因为我最初使用的是join-subclass(对不起,我没有早点指出过) - 所以这对我来说是一个很好的解决方案。我正在添加的课程是不是层次结构的一部分,但是当使用hbm2java时,它仍然有覆盖类的趋势。我搜索hbm2java控制参数没有成功;我想我正在考虑像EMF那样注释代码以防止覆盖的能力。 – slau 2010-01-19 17:50:59

+0

另外,您不能使用Hibernate 3和注释来将映射和代码保持在一起吗?我发现配置文件非常方便。你是否也从映射中生成数据库模式? – ewernli 2010-01-19 18:52:05