`
weigang.gao
  • 浏览: 482479 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

介绍Hibernate中的NamingStrategy

 
阅读更多

http://forum.javaeye.com/viewtopic.php?t=8486

在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的用处, 看看它是怎么修理这个问题的, 代码如下:

java代码: 


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加上: 
java代码: 


            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可以解决的脏活累活.

分享到:
评论

相关推荐

    hibernate 3.2中文手册 中文文档

    - 介绍如何在Servlet中使用Hibernate来处理业务逻辑,并将结果呈现给用户。 - **1.4.3 部署与测试** - 提供部署和测试该web应用的具体步骤。 - **1.5 总结** - 对本章内容进行总结,并强调了理解Hibernate基本...

    hibernate中文官方文档3.6

    - **实现NamingStrategy**:定义命名策略以定制Hibernate生成的SQL语句中的表名和字段名。 - **XML配置文件**:解释如何使用XML文件来配置Hibernate。 - **J2EE应用程序服务器的集成**:介绍Hibernate与J2EE应用程序...

    Hibernate+中文文档

    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上下文)管理 ...

    Hibernate中文详细学习文档

    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上下文)管理 ...

    hibernate3.2中文文档(chm格式)

    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上下文)管理 ...

    Hibernate 中文手册

    - **实现 NamingStrategy**:解释如何自定义 Hibernate 的命名策略,以符合特定的应用场景。 - **XML 配置文件**:深入分析 Hibernate 的 XML 配置文件格式及其组成部分。 - **J2EE 应用程序服务器的集成**:说明...

    hibernate4.1中文api

    - **构建与Maven**: 使用Maven作为项目构建工具,添加Hibernate依赖到`pom.xml`文件中。 - **启动和助手**: 创建SessionFactory实例,并通过它打开Session进行数据库操作。 - **加载和存储对象**: 使用Session的`...

    Hibernate 中文 html 帮助文档

    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上下文)管理 ...

    Hibernate中文参考文档

    - **2.2 实例状态**:介绍 Hibernate 中实体的状态,如瞬态、持久化、游离等。 - **2.3 JMX 整合**:描述如何将 Hibernate 与 Java 管理扩展 (Java Management Extensions, JMX) 结合使用。 - **2.4 对 JCA 的支持**...

    hibernate_reference中文文档.pdf

    此章节介绍了 Hibernate 中的对象/关系映射的基础概念和技术。 - **5.1 映射定义 (Mapping declaration)** - **5.1.1 Doctype**:定义文档类型声明。 - **5.1.2 Hibernate-mapping**:描述 Hibernate-mapping ...

    hibernate_reference使用指南全

    介绍如何处理 Hibernate 中的二进制大对象 (BLOB)。 - **3.4.4 二级缓存与查询缓存** Hibernate 提供了两种级别的缓存:一级缓存和二级缓存。一级缓存默认启用,而二级缓存需要额外配置。 - **3.4.5 查询...

    hibernate中文教材

    此外,还涉及日志、NamingStrategy的实现、XML配置文件的使用,以及在J2EE应用服务器中的集成,包括事务策略、JNDI绑定的SessionFactory、JTA环境下Current Session context管理和JMX部署。 持久化类部分讲解了如何...

    hibernate实现动态表查询的多种解决方案

    1. **命名策略(NamingStrategy)**:Hibernate默认使用一种命名策略来转换实体类属性名到数据库列名。如果希望自定义这种映射规则,可以通过实现`NamingStrategy`接口来自定义命名策略。 2. **拦截器(Interceptor...

    BONC_Hibernate

    - **第三部分**:介绍了一个基于Servlet的Web应用程序案例,演示了如何在实际项目中集成Hibernate。 2. **体系结构** - **概况**:概述Hibernate的架构设计。 - **JMX整合**:介绍如何利用JMX进行监控和管理。 ...

Global site tag (gtag.js) - Google Analytics