Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义可重用<;发电机>;hibernate映射中的元素_Java_Hibernate - Fatal编程技术网

Java 如何定义可重用<;发电机>;hibernate映射中的元素

Java 如何定义可重用<;发电机>;hibernate映射中的元素,java,hibernate,Java,Hibernate,我有一个Hibernatehbm.xml映射文件,它定义了大量的类映射。每一个都需要一个定义和相应的定义 在这个特定的应用程序中,定义非常复杂,包括设置许多参数(例如,增量大小、优化器等)。必须为每个类重复这个定义是很乏味的,并且会使映射变得混乱 如果我使用JPA注释,我可以在包级别定义ID生成器。但我并没有使用JPA(也不是一个选项),而且似乎最奇怪的是能够在JPA中做一些事情,而不是原生hibernate 我可以在其他地方指定生成器,并在映射中多次引用它吗?一种解决方法是在模板XML中定义它

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

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

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


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

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


这还允许您重用其他事物的定义(如复杂的列映射)。

这是Hibernate注释支持但Hibernate Core不支持的极少数事物之一。我过去处理这个问题的方式是:

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

    <generator class="com.mypackage.PredefinedGenerator">
      <param name="preset">preset1</param>
    </generator>
    
    
    预设1
    
    在您的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>
    
    
    塞奇洛
    my_序列
    500
    
    当然,如果您不需要多个预设,这可以简化。由于法律原因,我不能发布实际代码;但如果您对这种方法感兴趣,但上面的内容不清楚,请发表评论,我将尝试澄清