gpt4 book ai didi

java - 如何在 hibernate 映射中定义可重用的 元素

转载 作者:行者123 更新时间:2023-11-30 01:39:12 25 4
gpt4 key购买 nike

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

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

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

我可以在其他地方指定生成器,并在映射中多次引用它吗?

最佳答案

遗憾的是,这是 Hibernate Annotations 支持但 Hibernate Core 不支持的极少数事情之一。我过去解决这个问题的方法是:

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

因此,在 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>

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

关于java - 如何在 hibernate 映射中定义可重用的 <generator> 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com