我们将 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/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:
查看确保生成 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,例如:
2. http://sudhirmongia.blogspot.com/2010/08/naming-strategy-in-hibernate.html
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
2526 次 |
| 最近记录: |