`

hibernage命名策略

    博客分类:
  • j2ee
阅读更多
关于使用Hibernate annotation注解映射和命名策略的方式及相关问题解决
    一、首先引出以下几个观点:
    1).开发项目时,不管是否使用Hibernate,都应该为项目所涉及到的表名取个前缀(如果还有特别需要也可以再加个后缀[通常在处理大数量需要动态建表的时候有加后缀的必要]),这样也能保证与他人共享数据库时不至于发生表名冲突的问题,同时方便自己维护所有相关的表。
    2).在每个表中为每个字段都加个前缀也是挺有好处的:比如能避免和SQL语句关键字发生冲突的问题;在连接查询时也能方便地判断某某字段是属于某个表的。
    3).使用Hibernate annotation注解映射可以减少实体类相对应的.hbm.xml文件的维护(纯粹一体力活,能省则省),只需要针对实体类进行Annotation的方式配置即可。
   
    二、程序实验环境说明
        1.导入相关jar包
            1).hibernate必须用到的包(其实是3.2版本)
                    antlr-2.7.6.jar
                    asm-attrs.jar
                    asm.jar
                    cglib-2.1.3.jar
                    commons-collections-2.1.1.jar
                    commons-logging-1.0.4.jar
                    dom4j-1.6.1.jar
                    ehcache-1.2.3.jar
                    hibernate3.jar
                    jta.jar
                    log4j-1.2.11.jar
            2).hibernate annotations相关包:
                ejb3-persistence-1.0.2.GA.jar (用以持久化映射)
                hibernate-annotations.jar
                hibernate-commons-annotations-3.1.0.GA.jar
                slf4j-api-1.5.8.jar, slf4j-log4j12-1.5.8.jar(此两个jar是写相关日志需要用到的)
            3).Oracle驱动包
                classes12.jar
        2.开发环境
            Eclipse3.5
        3.数据库环境: Oracle9i
       
    三、相关文件
        1).实体类:
            package com.temp.domain;
   
            import java.io.Serializable;
            import java.util.Date;
           
            import javax.persistence.Column;
            import javax.persistence.Entity;
            import javax.persistence.GeneratedValue;
            import javax.persistence.Id;
            import javax.persistence.Table;
           
            import org.hibernate.annotations.GenericGenerator;
           
           
            @Entity
            @Table
            public class BasicCar implements Serializable{
                //Table注释标识和各个成员变量的Column注释标识都未指定name属性,是为了使命名策略中相关方法生效
           
                private static final long serialVersionUID = 6961767068555866935L;
               
                @Id
                @Column(nullable=false,length=32)
                @GeneratedValue(generator="hibernate-uuid")
                @GenericGenerator(name="hibernate-uuid",strategy="uuid")
                private String id;
               
                @Column(nullable=false,length=30,unique=false)
                private String name;
               
                @Column (nullable=true,length=50)
                private String factory;
               
                @Column(nullable=false)
                private Date date;
               
                /**
                 * 默认构造函数(做映射的必须)
                 */
                public BasicCar() {
                }
               
               
                public BasicCar(String name, String factory, Date date){
                    this.name=name;
                    this.factory=factory;
                    this.date=date;
                }
               
                public BasicCar(String id, String name, String factory, Date date){
                    this(name,factory,date);
                    this.id=id;
                }
               
           
                public String toString(){
                    return  "id="+id+
                            ",name="+name+
                            ",factory="+factory+
                            ",date="+date;
                }
            }
       
       
        2).命名策略类
            package com.temp;
   
            import java.text.SimpleDateFormat;
            import java.util.Date;
            import org.hibernate.cfg.NamingStrategy;
            import org.hibernate.util.StringHelper;
           
            public class MyNamingStrategy implements NamingStrategy {
           
                private static MyNamingStrategy namingStrategy;
                private String currentClassName="";
                private String currentColumnName="";
                private String needDatePostfixTables[]={"ServiceVisitLog","BasicCar"}; //需要添加时间后缀的实体类名
           
                private MyNamingStrategy() {
                }
               
                public static MyNamingStrategy getInstance(){
                    if(namingStrategy==null){
                        namingStrategy = new MyNamingStrategy();
                    }
                    return namingStrategy;
                }
               
                //实现NamingStrategy接口方法(为每个实体映射成数据库表名时添加一个前缀)
                public String classToTableName(String className) {
                    className = StringHelper.unqualifyEntityName(className); // 先去包名(如果有的话),取类名
                    this.currentClassName=className;
                    String tablePrefix="Test_"; //表名前缀
                    String tableName=tablePrefix+className;
                    int dptLength=needDatePostfixTables.length;
                    for(int i=0;i<dptLength;i++){
                        //根据需要进行表名后缀的添加
                        if(needDatePostfixTables[i].equals(className)){
                            tableName=tableName + getPostfixCurrentyyyyMMdd();
                        }
                    }
                    return tableName;
                }
           
                public String tableName(String tableName) {
                    return tableName;
                }
           
                //实现NamingStrategy接口方法(为每个属性映射成数据库表字段时添加一个前缀,提取每个类各单词首字母并加一个下划线做为前缀)
                public String propertyToColumnName(String propertyName) {
                    char[] chars = this.currentClassName.toCharArray();
                    String columnPrefix = ""; //字段名前缀
                    for (int i = 0; i < chars.length; i++) {
                        if (Character.isUpperCase(chars[i])) {
                            columnPrefix=columnPrefix+chars[i];
                        }
                    }
                    String columnName=propertyName;
                    if(columnPrefix.length()>0){
                        columnName=columnPrefix+"_"+columnName;
                    }
                    this.currentColumnName=columnName;
                    return columnName;
                }
           
                public String columnName(String columnName) {
                    //System.out.println("columnName="+columnName);
                    return columnName;
                }
           
                public String logicalColumnName(String columnName, String propertyName) {
                    if (this.currentColumnName != null) {
                        return this.currentColumnName;
                    } else {
                        return propertyName;
                    }
                }
           
                public String collectionTableName(String string, String string1,
                        String string2, String string3, String string4) {
                    return "";
                }
           
                public String foreignKeyColumnName(String string, String string1,
                        String string2, String string3) {
                    return "";
                }
           
                public String joinKeyColumnName(String string, String string1) {
                    return "";
                }
           
                public String logicalCollectionColumnName(String string, String string1,
                        String string2) {
                    return "";
                }
           
                public String logicalCollectionTableName(String string, String string1,
                        String string2, String string3) {
                    return "";
                }
               
                //得到一个形如"_20100331"之类的字符串
                private String getPostfixCurrentyyyyMMdd(){
                    Date date=new Date();
                    SimpleDateFormat df=new SimpleDateFormat("yyyyMMdd");
                    String yyyyMMdd=df.format(date);
                    return "_" +yyyyMMdd;
                }
            }
       

        3).hibernate.cfg.xml文件
            <?xml version='1.0' encoding='utf-8'?>
            <!DOCTYPE hibernate-configuration PUBLIC
                    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
           
            <hibernate-configuration>
                <session-factory>
                    <!-- OracleDriver Database connection settings-->
                    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
                    <property name="connection.url">jdbc:oracle:thin:@192.168.10.116:1521:test</property>
                    <property name="connection.username">temp</property>
                    <property name="connection.password">temp</property>
                    <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
                   
                    <!-- Disable the second-level cache  -->
                    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
           
                    <!-- Echo all executed SQL to stdout -->
                    <property name="show_sql">true</property>
                    <property name="format_sql">false</property>
           
                    <!-- Drop and re-create the database schema on startup -->
                    <property name="hbm2ddl.auto">update</property>
           
                    <mapping class="com.temp.domain.BasicCar"/>
                </session-factory>
            </hibernate-configuration>
       
       
        4).测试类Test.java
            package com.temp.test;
           
            import java.util.Date;
            import java.util.List;
           
            import org.hibernate.Query;
            import org.hibernate.Session;
            import org.hibernate.SessionFactory;
            import org.hibernate.Transaction;
            import org.hibernate.cfg.AnnotationConfiguration;
           
            import com.temp.MyNamingStrategy;
            import com.temp.domain.BasicCar;
           
            public class Test {
                AnnotationConfiguration cfg;
               
                SessionFactory sf;
               
                Session session;
               
               
                void doConfiguration(){
                    cfg = new AnnotationConfiguration(); //使用了注释的方式则创建此类
                    //必须放在configure语句之前命名策略才有效(同时需要注意在实体类配置时不能显示指定Table的名称和Column的名称)
                    cfg.setNamingStrategy(MyNamingStrategy.getInstance());
                    cfg.configure("/hibernate.cfg.xml");
                    sf=cfg.buildSessionFactory();
                }
               
                public static void main(String[] args) {
                    Test t=new Test();
                    t.doConfiguration();
                    t.insert();
                    t.query();
                }
               
                public void insert(){
                    session=sf.openSession();
                    BasicCar bc=new BasicCar("paul", "easymap", new Date());
                    Transaction tx=session.beginTransaction();
                    session.save(bc);
                    tx.commit();
                    session.close();
                }
               
                @SuppressWarnings(value = { "unchecked" })
                public void query(){
                    session=sf.openSession();
                    Query query=session.createQuery("from BasicCar");
                    List list=query.list();
                    int cnt=list.size();
                    System.out.println("当前共有"+cnt+"条记录,最后一条记录是:"+list.get(cnt-1));
                    session.close();
                }
           
            }
   
    四、相关问题说明及解决方法
        如果明明在hibernate.cfg.xml文件中配置了<property name="hbm2ddl.auto">update</property>却仍然不能自动建表,则有可能是当前连接至数据库中的用户(如本例中的temp)的配额(此处的配额不是指表空间的配额)不足所造成的(这种问题本人也是在使用plsql进行create table时发现说"Ora-01536:超出了表空间users的空间限量"时才发现的),因此特别建议当使用了Hibernate或其它ORM框架之后出现了一些诡异的问题时,建议直接到数据库的控制台或plsql进行相关操作或SQL语句的执行,以找到真正的问题!

         Ora-01536 是指的你建表的那个user所能使用的空间没有了,不是那个表所在的tablespace没有free space 了。你需要做的是给那个user对那个tablespace 有更多的space可以使用。
                解决方法:在plsql中执行 "ALTER USER temp QUOTA UNLIMITED ON users;" 语句使得temp用户对于表空间Users无限制配额存取.

分享到:
评论

相关推荐

    Struts2.5+Spring5+Hibernage5框架样例以及lib包.rar

    这个压缩包“Struts2.5+Spring5+Hibernage5框架样例以及lib包.rar”提供了这三个框架的最新版本示例和库文件,对学习和理解SSH框架的集成有着重要的参考价值。 1. **Struts2.5**: Struts2 是一个基于MVC设计模式...

    hibernage文档3.2

    在**hibernage文档3.2**中,我们可以学习到以下关键知识点: 1. **ORM基础**:ORM是Object-Relational Mapping的缩写,它将数据库的表结构映射为Java类,使得数据库操作可以通过对象进行。Hibernate是ORM框架的一种...

    eclipse 运行hibernage 需要package

    首先,`hibernage 需要package`这个表述可能是指运行Hibernate应用程序时,需要导入相关的Java包。Hibernate的核心依赖包括但不限于以下这些: 1. **Hibernate核心库**:这是Hibernate的基础,包含了ORM的主要功能...

    springMVC+hibernage+spring(基于spring2.5和hibernate3.0)jar包

    Spring MVC、Hibernate 和 Spring 是Java开发中非常重要的三个框架,它们在企业级应用开发中扮演着核心角色。这里我们主要探讨基于Spring 2.5和Hibernate 3.0的集成应用。 Spring MVC 是Spring框架的一个模块,专注...

    Hibernage高级资料

    - Hibernate 的配置文件(通常为`hibernate.cfg.xml`)是设置数据库连接、方言、缓存策略等核心参数的地方。在高级使用中,我们可能会涉及动态加载配置、多数据源配置以及自定义属性设置。 - SessionFactory 的...

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part3

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1.第3部分。三部分全下完再解压第一部分!

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part2

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1.第二部分。三部分全下完再解压第一部分!

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1,第一部分,。将三部分一起下载完后再解压第一部分!

    hibernage3.2.1源码

    Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),通过缓存策略提高了数据访问效率。同时,还支持第三方缓存服务,如Ehcache。 4. **查询语言HQL** Hibernate Query ...

    chinamobile的Struts+Hibernage+Spring例子

    本系统采用struts+spring+hibernate架构,重在讲述三者结合在一起的应用开发,所有源程序都 有详细的注释,供入门者学生参考,未经作者允许不得用于商业用途,只能用于教学或个人学习。 程序只是整个系统中的...

    Hibernate实战

    此外,还会讲解实体间的一对一、一对多、多对一、多对多的关系映射,以及继承映射策略。 数据持久化是Hibernate的核心功能,书中会展示如何使用Hibernate进行CRUD操作(创建、读取、更新和删除)。这涉及到使用...

    hibernate的xml配置关系例子

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者通过Java对象来操作数据库,而无需直接编写SQL语句。在这个"hibernate的xml配置关系例子"中,我们将探讨如何使用XML配置文件来定义...

    hibernate5最新版jar包下载(全)

    【hibernate5最新版jar包下载(全)】 Hibernate是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方案。在Java应用开发中,特别是企业级应用,Hibernate作为数据库访问层,能够极大地简化...

    weblogic10.3 org.hibernate.hql.ast.HqlToken报错问题

    在IT行业中,尤其是在Java企业级应用开发领域,WebLogic服务器是一个广泛应用的中间件,用于部署和管理Java EE应用程序。在本问题中,我们遇到了一个特定的错误,即“weblogic10.3 org.hibernate.hql.ast.HqlToken...

    Hibernager_Session_Manager_ThreadLocal

    标题“Hibernage_Session_Manager_ThreadLocal”涉及到的是Hibernate框架中的一种优化策略——使用ThreadLocal管理Session。在Java Web开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它帮助开发者将...

    hibernate的分页模糊查询功能

    3. 使用命名参数,而不是直接将值拼接到HQL中,这样可以避免特殊字符的问题,同时提高可读性。 4. 如果Map中的条件数量非常多,可以考虑使用动态SQL库如MyBatis,它在处理复杂的动态查询条件方面更为便捷。 总的来...

    基于struts2+hibernate+mysql的个人博客

    该博客系统基于struts2+hibernage+mysql,十分实用,其中数据库和说明文档一应具备,内附数据库和工程文件,下载后将数据库导入和用Myeclipse重新发布一下工程即可使用,功能十分强大。

    hibernate-example:该项目展示了Hibernate的基本功能

    Hibernate示例该项目展示了Hibernate的... 包含必要的Maven依赖项( pom.xml ),Hibernate配置( src/main/resources/hibernage.cfg.xml )和SessionFactory准备( src/main/java/hibernate/HibernateHelper.java )分

    multi-postgres-jpa.zip

    在实际项目中,`pom.xml`可能会有Spring Boot Starter Data JPA依赖,以引入JPA和Hibernage的相关库。同时,项目可能包含多个配置类,如`DataSourceConfiguration.java`和`JpaConfig.java`,用于配置不同的数据源和...

    SpringBoot学习笔记+新手练习源码

    3. **自动配置**:Spring Boot根据项目中引入的依赖自动配置相应的Bean,例如引入了JPA,就会自动配置数据源、JPA、Hibernage等。 4. **命令行接口(CLI)**:提供了命令行工具,方便进行快速原型开发。 5. **...

Global site tag (gtag.js) - Google Analytics