Java 使JPA@Column name特定于db方言或取决于属性

Java 使JPA@Column name特定于db方言或取决于属性,java,sql-server,oracle,jpa,Java,Sql Server,Oracle,Jpa,问题 我们构建了一个InternJavaSpring框架,用于两个不同的项目。一个项目使用OracleDB,另一个项目使用MS SQL 当谈到保留关键字时,MS SQL抱怨key。 因此,我们通过转义修复了列名: public class MyEntity { @Column(name = "\"key\"") private String key; private String foo; 但现在它不再在oracle db中工作,

问题

我们构建了一个InternJavaSpring框架,用于两个不同的项目。一个项目使用OracleDB,另一个项目使用MS SQL

当谈到保留关键字时,MS SQL抱怨
key
。 因此,我们通过转义修复了列名:

public class MyEntity {
    @Column(name = "\"key\"")
    private String key;
    private String foo;
但现在它不再在oracle db中工作,因为生成的sql现在包含转义字符:

  • 从myEntity中选择myEntity.“键”,myEntity.foo
  • (java.sql.SQLSyntaxErrorException:ORA-00904:“myEntity.”key:无效标识符”)
问题

  • 根据db方言或某些外部属性,是否可能在一个属性上有2个javax.persistence.Column注释
  • 是否有可能编写自己的注释,然后区分这两种情况?(假设实体扫描不考虑自己的注释)

这里的问题是,在Oracle中重复引用标识符会使其区分大小写。如果Oracle架构是在没有引用列定义的情况下创建的,则默认情况下,创建的列名为大写

另一方面,由于MSSQL默认不区分大小写,我怀疑
@Column(name=“\”KEY\”)
会起作用(MSSQL将忽略大小写,而大写名称将匹配Oracle的列定义)

根据db方言或某些外部属性,是否可能在一个属性上有2个javax.persistence.Column注释

可以使用XML实体映射覆盖列注释

是否有可能编写自己的注释,然后区分这两种情况?(假设实体扫描不考虑自己的注释)


没有。不过,也许您可以实施一个自定义的
物理命名策略。

谢谢。所以我的假设是错误的,为什么我的sql语句不能工作。但是更改裸sql语句(大写键)表明该解决方案可以工作。如果其他人会遇到:我还考虑在ms sql项目中设置“hibernate.globally_quoted_identifiers=true”,以避免对ms sql进行特殊处理。