ryn*_*rtn 13 java hibernate jpa
我正在开发一个使用Hibernate并连接到Oracle实例的Java应用程序.另一个客户端希望使用相同的应用程序,但要求它在MS SQL Server上运行.我想避免对现有注释进行更改,而是创建一个xml文件包,我们可以根据环境将其放入.
一种方法是使用JPA XML配置覆盖现有的类注释.但是,JPA不支持通用生成器,由于我们的遗留数据库的结构,这是一个要求.我正在研究的另一种方法是使用Hibernate XML配置重新映射整个类并访问generatorxml标记.这个解决方案有一些问题:
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实体.