Hibernate 为 Oracle 生成的标识符太长

Mar*_*ila 3 oracle hibernate

我们将 JPA 与 Hibernate 4.3.8 和 Oracle 11 结合使用。我们的实体没有在注释中声明显式的数据库标识符名称,因此我们依靠 Hibernate 来正确生成它们。

对于 MySQL,它工作正常,但在我们切换到 Oracle 后,我们遇到了一些问题。

其中之一是 Hibernate 生成的模式包含的标识符比 Oracle 支持的长度长。我们以为这样就Oracle10gDialect可以解决问题,但看来我们错了。

向我们的应用程序添加 Oracle 支持的最佳方法是什么?@Table我们必须在注释( ,@Column...)中显式声明所有数据库表/列/索引...吗?难道不应该由 Hibernate 来处理这个特定于方言的任务吗?

另一个问题是 Hibernate 也不转义关键字(例如,列名code在 Oracle 中必须转义)。如果我们决定将来支持另一个数据库怎么办?我们必须选择所有标识符名称以便它们都适合每个数据库吗?这似乎是非常压倒性的。(请注意,该属性hibernate.globally_quoted_identifiers可以部分解决该问题,但@UniqueConstraint列不匹配。)

或者也许... Eclipselink 可以处理这个问题吗?

prz*_*tel 5

在这种情况下,您可以使用 Hibernate为 Oracle 准备的NamingStrategy。简而言之:NamingStrategy告诉 Hibernate 如何为列或表生成名称

您可以像我一样为每个 Oracle/Hibernate 项目提供Oracle 感知功能。 NamingStrategy

以下是 JPA 配置示例:

<bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
  ...

<property name="jpaPropertyMap">
 <map>
  <entry key="hibernate.ejb.naming_strategy" value="com.mycompany.OracleNamingStrategy"/>
  <entry key="hibernate.dialect"         value="org.hibernate.dialect.Oracle10gDialect"/>
    ...
 </map>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)

这是我在许多项目中使用的 NamingStrategy:

https://code.google.com/p/hibernate-naming-strategy-for-oracle/source/browse/trunk/src/de/schauderhaft/hibernate/OracleNamingStrategy.java

查看确保生成 Oracle 兼容名称的智能缩写方法:

public static String abbreviateName(String someName) {
    if (someName.length() <= MAX_LENGTH)
        return someName;

    String[] tokens = splitName(someName);
    shortenName(someName, tokens);

    return assembleResults(tokens);
}
Run Code Online (Sandbox Code Playgroud)

关于使用Hibernate进行应用的文章有很多NamingStratety,例如:

1. http://www.petrikainulainen.net/programming/tips-and-tricks/implementing-a-custom-namingstrategy-with-hibernate/

2. http://sudhirmongia.blogspot.com/2010/08/naming-strategy-in-hibernate.html

我希望这有帮助。

  • 由于 OracleNamingStrategie 移至 GitHub,我认为最好在此处提供链接:https://github.com/schauder/hibernate-naming-strategy-for-oracle (2认同)