Hibernate 3.2 GA中结合EntityManager实现命名策略及处理Oracle关键字列名求助
解决Hibernate 3.2 GA中自定义NamingStrategy不生效的问题
我之前在Hibernate 3.2版本里踩过一模一样的坑,给你梳理几个关键的排查点和解决方案,应该能快速搞定:
1. 修正persistence.xml中的配置属性名
你当前配置的hibernate.naming-strategy是错误的!在Hibernate 3.x版本中,命名策略的正确属性名是**hibernate.naming.strategy**(注意是点分隔,不是横杠)。这个拼写错误会直接导致Hibernate忽略你的自定义策略,改成下面这样:
<property name="hibernate.naming.strategy" value="com.group.MyStrategy" />
另外注意类名的大小写,Java类名规范是首字母大写,如果你实际类名是MyStrategy而不是myStrategy,一定要对应上,否则Hibernate找不到这个类。
2. 确保自定义NamingStrategy覆盖了正确的方法
继承DefaultNamingStrategy后,要针对属性到列名的映射覆盖propertyToColumnName方法,而不是其他方法。比如针对size属性做特殊处理的示例代码:
package com.group; import org.hibernate.cfg.DefaultNamingStrategy; public class MyStrategy extends DefaultNamingStrategy { @Override public String propertyToColumnName(String propertyName) { // 把实体类中的"size"属性映射为数据库的"ENTITY_SIZE"列 if ("size".equals(propertyName)) { return "ENTITY_SIZE"; } // 其他属性沿用默认命名规则 return super.propertyToColumnName(propertyName); } }
如果你的需求是全局处理关键字,也可以扩展逻辑,比如自动给关键字加前缀/后缀,但针对单个属性的处理这样写就足够了。
3. 兜底方案:直接使用@Column注解
如果上面的配置还是不生效(比如项目中存在其他配置冲突),可以直接在实体类的size属性上添加@Column注解指定列名,这在Hibernate 3.2里是100%生效的:
@Entity public class YourEntity { // ...其他属性 @Column(name = "ENTITY_SIZE") private Integer size; // getter和setter }
额外排查点
- 确认persistence.xml放在了正确的位置:Java项目要放在
src/main/resources/META-INF下,Web项目要放在WEB-INF/classes/META-INF下,确保Hibernate能加载到这个配置文件。 - 检查项目依赖中Hibernate 3.2的jar包是否完整,有没有混入其他版本的Hibernate jar导致冲突。
内容的提问来源于stack exchange,提问作者Jason Williams
相关产品推荐
相关产品推荐

