我有一个Hibernate hbm.xml
映射文件,它定义了大量的类映射。其中每个都需要<id>
定义和相应的<generator>
定义。
在这个特定的应用程序中,<generator>
定义非常复杂,包括设置一些参数(例如增量大小,优化器等)。必须为每个类重复这个定义是乏味的,并且使映射变得混乱。
如果我使用JPA注释,我可以在包级别定义ID生成器。但是我没有使用JPA(也不是一个选项),在JPA中做一些事情而不是原生的休眠似乎最奇怪。
我可以在别处指定生成器,并在映射中多次引用它吗?
答案 0 :(得分:2)
令人遗憾的是,Hibernate Annotations支持的东西很少,但Hibernate Core却没有。我过去解决这个问题的方式是:
IdentifierGenerator
实现;也让它实现Configurable
。afterPropertiesSet()
)使用bean id作为键将bean属性添加到上面的映射。底层生成器“策略”是其中一个属性。Configurable.configure()
通过IdentifierGeneratorFactory.getIdentifierGeneratorClass()
抓取底层生成器,并使用与上面地图中检索到的属性合并的configure()
传递的Properties实例初始化它。因此,在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脚本来构建映射文件。
这也可以让你重用其他东西的定义(比如复杂的列映射)。