覆盖Hibernate注释

ryn*_*rtn 13 java hibernate jpa

我正在开发一个使用Hibernate并连接到Oracle实例的Java应用程序.另一个客户端希望使用相同的应用程序,但要求它在MS SQL Server上运行.我想避免对现有注释进行更改,而是创建一个xml文件包,我们可以根据环境将其放入.

一种方法是使用JPA XML配置覆盖现有的类注释.但是,JPA不支持通用生成器,由于我们的遗留数据库的结构,这是一个要求.我正在研究的另一种方法是使用Hibernate XML配置重新映射整个类并访问generatorxml标记.这个解决方案有一些问题:

  • Hibernate不允许您有选择地覆盖实体成员
  • Hibernate不允许你重新映射同一个类(例如org.hibernate.AnnotationException: Use of the same entity name twice)

有没有人有使用Hibernate XML配置文件覆盖注释的经验,或者JPA是唯一的方法吗?

使用示例进行更新

在Oracle中,序列用于在将新记录插入数据库时​​生成唯一ID.然后以下列方式注释id:

@Id
@GeneratedValue(generator="EXAMPLE_ID_GEN", strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name="EXAMPLE_ID_GEN", sequenceName="SEQ_EXAMPLE_ID")
@Column(name = "EXAMPLE_ID")
public String getExampleId() {
    return this.exampleId;
}
Run Code Online (Sandbox Code Playgroud)

但是,MS SQL Server没有Sequences的概念(思想差异).因此,您可以使用表生成器来模拟序列.

@Id
@GeneratedValue(generator="EXAMPLE_ID_GEN", strategy=GenerationType.TABLE)
@TableGenerator(name="EXAMPLE_ID_GEN", tableName="SEQUENCE", valueColumnName="VALUE", pkColumnName="SEQUENCE", pkColumnValue="EXAMPLE_ID")
public String getExampleId() {
    return this.exampleId;
}
Run Code Online (Sandbox Code Playgroud)

两种不同类型数据库的两种不同配置.请记住,这是一个遗留数据库,我们不会重写我们的应用程序来支持SQL Server身份,SQL Server的本机ID生成器(也需要不同的注释).

为了解决这个问题,我已经研究过使用Hibernate @GenericGenerator并将其指向我自己创建的一类模型org.hibernate.id.SequenceGenerator(或类似的东西),并通过扩展来定制表的结构org.hibernate.id.TableStructure.

回到我原来的问题 - 使用XML覆盖是否可以实现这一切?

我是如何解决这个问题的

所以,最后,我发现JPA和Hibernate没有提供我正在寻找的开箱即用功能.相反,我创建了一个自定义生成器,它检查数据库方言并适当地设置TableStructure.当我探索所有选项时,我最终使用了Hibernate的@GenericGenerator注释.这是Id生成注释的示例:

@Id
@GeneratedValue(generator="EXAMPLE_ID_GEN")
@GenericGenerator(name = "EXAMPLE_ID_GEN", strategy="com.my.package.CustomIdGenerator", parameters = {
        @Parameter(name = "parameter_name", value="parameter_value")
})
public String getExampleId() {
    return this.exampleId;
}
Run Code Online (Sandbox Code Playgroud)

此解决方案需要使用新的Id生成器修改每个Hibernate实体.

jam*_*mes 0

我想说,如果您的注释是特定于数据库的,那么您就做错了。