代码之家  ›  专栏  ›  技术社区  ›  slau

映射Hibernate“自定义”子类

  •  0
  • slau  · 技术社区  · 16 年前

    作为一个新的Hibernate用户,我听说向生成的类添加一些helper方法的一个好模式是将它们添加到子类中。例如:

    // 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;
      }
    }
    

    我希望能够做到以下几点:让Hibernate返回MyGeneratedClass而不是GeneratedClass类型的对象,这样我就可以直接使用子类。映射文件能否以这种方式定义(即,在生成时不覆盖任何自定义代码)?

    提前谢谢!

    在尝试联合类策略之后,我意识到它在我的情况下不起作用,因为现有的类层次结构和数据。此外,我无法控制生成过程是否覆盖了我的子类(hbm2java中的一个理想特性可能是?)。最后,我确实考虑在代码映射文件中嵌入代码,但是覆盖诸如GETER和Stter这样的东西看起来相当乏味。

    我回顾了该方法,并决定继续注释域对象,避免完全使用hbm2java。这并不完全理想(映射似乎更容易处理),但从我从各种来源收集的信息来看,这可能是处理我的特殊情况的最合适的方法,因为它让我可以自由地通过类型检查定制代码,并且只处理类文件。

    编辑2

    <meta attribute="generated-class">CountryBase</meta>
    

    是对最初描述的原始问题的良好解决方案。

    1 回复  |  直到 16 年前
        1
  •  1
  •   ewernli    16 年前

    我想做的是 下面是:让Hibernate返回 MyGeneratedClass类型的对象 而不是生成类,这样我 可以直接使用子类。

    <class name="Subclass" table="table"> . 然后你用 Subclass.class 查询实体。

    对于任何可能的解决方案,如果 层次结构(即GeneratedClassTypeA, GeneratedClassTypeB两个扩展 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 标签是空的。

    你也试过了吗 <meta attribute="generated-class">CountryBase</meta> ? 从未使用过,但它似乎适合这个用途。请参见中的“使用基类” Hibernate Class Generation with hbm2java