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

如何在hibernate映射中定义可重用的<generator>元素

  •  1
  • skaffman  · 技术社区  · 15 年前

    我冬眠了 hbm.xml 定义大量类映射的映射文件。每一个都需要一个 <id> 定义和相应的 <generator> 定义。

    <发电机> 定义非常复杂,包括设置许多参数(例如增量大小、优化器等)。必须为每个类重复这个定义是很乏味的,并且会使映射变得混乱。

    如果我使用JPA注释,我可以在包级别定义ID生成器。但我并没有使用JPA(也不是一个选项),而且似乎最奇怪的是能够在JPA中做一些事情,而不是原生hibernate。

    我可以在别处指定生成器,并在映射中多次引用它吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   ChssPly76    15 年前

    遗憾的是,这是Hibernate注解支持的为数不多的事情之一,但Hibernate内核不支持。我过去处理这个问题的方式是:

    1. 写我自己的 IdentifierGenerator 实施实施 Configurable
    2. 让它保存由唯一名称键入的生成器属性的静态映射(每个映射条目将表示“预定义”的生成器配置)。
    3. 所述配置在Spring上下文中使用这个非常相同的类声明为bean(或者,如果您想要/需要某种类型安全性,您可以使用setter使它们成为实际的bean)。创建后回调(例如。 afterPropertiesSet()
    4. Configurable.configure() 通过 IdentifierGeneratorFactory.getIdentifierGeneratorClass() 并使用传递给的属性实例对其进行初始化 configure() 与从上述映射检索到的属性合并。

    因此,在Hibernate映射中,您可以执行以下操作:

    <generator class="com.mypackage.PredefinedGenerator">
      <param name="preset">preset1</param>
    </generator>
    

    在您的Spring环境中:

    <bean id="preset1" class="com.mypackage.PredefinedGenerator">
      <property name="parameters"><props>
        <prop key="generatorStrategy">seqhilo</prop>
        <prop key="sequence">my_sequence</prop>
        <prop key="max_lo">500</prop>
      </props></property>
    </bean>
    

    当然,如果您不需要多个预设,这可以简化。由于法律原因,我不能发布实际代码;但如果您对这种方法感兴趣,但上面的内容不清楚,请发表评论,我将尝试澄清。

        2
  •  1
  •   Aaron Digulla    15 年前

    一种解决方法是在XML模板中定义它,然后使用小型XML程序或XSLT脚本构建映射文件。