gpt4 book ai didi

oracle - Hibernate 为 Oracle 生成的标识符太长

转载 作者:行者123 更新时间:2023-12-01 12:34:55 25 4
gpt4 key购买 nike

我们将 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 会处理这个吗?

最佳答案

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

您可以提供oracle-awareNamingStrategy,就像我为我的每个 Oracle/Hibernate 项目所做的那样。

这是示例 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>

这是我在许多项目中使用的 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);
}

关于在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

希望对您有所帮助。

关于oracle - Hibernate 为 Oracle 生成的标识符太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30577953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com