在Java对象里面, 偶们知道一个良好的命名规范会采用大写单词的首字母, 比如订单项这个对象, 偶们会起名为OrderItem, 这样很容易就看出来这个对象是由Order和Item 2个单词组成的, 断词就很容易了, 而属性也是如此, 比如maxPrice, totalPrice等等.
但是如果按照同样的命名规范运到数据库的时候, 由于很多数据库对于表名, 字段名是大小写不敏感的, 所以最常见的策略是加下划线作为断词的依据:
OrderItem -> order_item
maxPrice -> max_price
这样运用Hibernate的时候, 偶们就得手工在mapping文件里面指明:
<class name="OrderItem" table="order_item">
<property name="maxPrice" column="max_price"/>
每个mapping关系都得手工这样写, 是不是很不爽? 现在来介绍一下net.sf.hibernate.cfg.NamingStrategy的用处, 看看它是怎么修理这个问题的, 代码如下:
import net.sf.hibernate.cfg.NamingStrategy;
import net.sf.hibernate.util.StringHelper;
/**
* An improved naming strategy that prefers embedded underscores to mixed case
* names, base on DefaultNamingStrategy and ImprovedNamingStrategy
*
*/
public class UnderscoreNamingStrategy implements NamingStrategy {
public static final NamingStrategy INSTANCE = new UnderscoreNamingStrategy();;
protected UnderscoreNamingStrategy(); {
}
public String classToTableName(String className); {
return addUnderscores(StringHelper.unqualify(className););;
}
public String propertyToColumnName(String propertyName); {
return addUnderscores(StringHelper.unqualify(propertyName););;
}
public String tableName(String tableName); {
return tableName;
}
public String columnName(String columnName); {
return columnName;
}
public String propertyToTableName(String className, String propertyName); {
return classToTableName(className); + '_' + propertyToColumnName(propertyName);;
}
private String addUnderscores(String name); {
StringBuffer buf = new StringBuffer(name.replace('.', '_'););;
for (int i = 1; i < buf.length(); - 1; i++); {
if ('_' != buf.charAt(i - 1); && Character.isUpperCase(buf.charAt(i);); && !Character.isUpperCase(buf.charAt(i + 1););); {
buf.insert(i++, '_');;
}
}
return buf.toString();.toLowerCase();;
}
}
在初始化配置的时候, 把这个NamingStrategy加上:
Configuration config = new Configuration();;
config.setNamingStrategy(UnderscoreNamingStrategy.INSTANCE);;
这样mapping文件就变得简单多了:
<class name="OrderItem">
<property name="maxPrice"/>
NamingStrategy还可以用在其他方面, 比如有些数据库设计规范统一要求Table前面加上模块名称 (如, 属于Order模块的统一加上ORDER_ ), 比如还有些恶心规范统一要求表名和字段名采用4码缩写 (如, OrderItem -> orde_item, maxPrice -> max_pric), 这些都是NamingStrategy可以解决的脏活累活.
http://www.iteye.com/topic/8486?page=1
分享到:
相关推荐
- 介绍如何在Servlet中使用Hibernate来处理业务逻辑,并将结果呈现给用户。 - **1.4.3 部署与测试** - 提供部署和测试该web应用的具体步骤。 - **1.5 总结** - 对本章内容进行总结,并强调了理解Hibernate基本...
- **实现NamingStrategy**:定义命名策略以定制Hibernate生成的SQL语句中的表名和字段名。 - **XML配置文件**:解释如何使用XML文件来配置Hibernate。 - **J2EE应用程序服务器的集成**:介绍Hibernate与J2EE应用程序...
3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 ...
3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 ...
3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 ...
3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 ...
- **构建与Maven**: 使用Maven作为项目构建工具,添加Hibernate依赖到`pom.xml`文件中。 - **启动和助手**: 创建SessionFactory实例,并通过它打开Session进行数据库操作。 - **加载和存储对象**: 使用Session的`...
- **1.3.3 使关联工作**:解释如何确保关联关系在 Hibernate 中正确运行。 - **1.3.4 值类型的集合**:讲解如何处理 Java 类中的集合属性。 - **1.3.5 双向关联**:介绍双向关联的概念和实现方法。 - **1.3.6 使...
Hibernate 是一个开源的对象关系映射 (ORM) 框架,它为 Java 应用程序提供了一种将 Java 对象映射到关系型数据库表中的机制。本章节将详细介绍如何从零开始创建一个简单的 Hibernate 应用程序。 **1.2 第一个 ...
1. **命名策略(NamingStrategy)**:Hibernate默认使用一种命名策略来转换实体类属性名到数据库列名。如果希望自定义这种映射规则,可以通过实现`NamingStrategy`接口来自定义命名策略。 2. **拦截器(Interceptor...
- **实现 NamingStrategy**:解释如何自定义 Hibernate 的命名策略,以符合特定的应用场景。 - **XML 配置文件**:深入分析 Hibernate 的 XML 配置文件格式及其组成部分。 - **J2EE 应用程序服务器的集成**:说明...
此外,还涉及日志、NamingStrategy的实现、XML配置文件的使用,以及在J2EE应用服务器中的集成,包括事务策略、JNDI绑定的SessionFactory、JTA环境下Current Session context管理和JMX部署。 持久化类部分讲解了如何...
- **3.6 实现 NamingStrategy**:解释如何自定义 Hibernate 的命名策略,以适应特定的应用场景。 - **3.7 XML 配置文件**:讲解如何通过 XML 文件来配置 Hibernate。 - **3.8 J2EE 应用程序服务器的集成** - **...