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

时间:2009-10-07 06:58:08

标签: java hibernate

我有一个Hibernate hbm.xml映射文件,它定义了大量的类映射。其中每个都需要<id>定义和相应的<generator>定义。

在这个特定的应用程序中,<generator>定义非常复杂,包括设置一些参数(例如增量大小,优化器等)。必须为每个类重复这个定义是乏味的,并且使映射变得混乱。

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

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

2 个答案:

答案 0 :(得分:2)

令人遗憾的是,Hibernate Annotations支持的东西很少,但Hibernate Core却没有。我过去解决这个问题的方式是:

  1. 编写我自己的IdentifierGenerator实现;也让它实现Configurable
  2. 让它保存由唯一名称键入的生成器属性的静态映射(每个映射条目将代表“预定义”生成器配置)。
  3. 所说的配置在Spring上下文中使用这个相同的类声明为bean(或者,如果你想/需要某些类型的安全性,你可以使它们成为带有setter的实际bean)。创建后回调(例如afterPropertiesSet())使用bean id作为键将bean属性添加到上面的映射。底层生成器“策略”是其中一个属性。
  4. Configurable.configure()通过IdentifierGeneratorFactory.getIdentifierGeneratorClass()抓取底层生成器,并使用与上面地图中检索到的属性合并的configure()传递的Properties实例初始化它。
  5. 因此,在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>
    

    当然,如果您不需要多个预设,这可以简化。我出于法律原因无法发布实际代码;但如果你对这种方法感兴趣,但上述内容不明确,请发表评论,我会尽力澄清。

答案 1 :(得分:1)

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

这也可以让你重用其他东西的定义(比如复杂的列映射)。