Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4887
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 18:03
文章分类

全部博文(4)

文章存档

2015年(4)

我的朋友
最近访客

分类: 数据库开发技术

2015-11-04 10:31:25

hibernate作为一个著名的持久层ORM(object relationship Map)框架而深受人们喜欢。最近出了Hibernate5,我也先尝尝鲜。
第一步:下载相关的jar包,由于使用mysql做为数据源,所有除了需要下载Hibernate5之外,还要下载mysql-connector-/J驱动库。
第二步:建立java Application 项目。
第三步:导包,必须的lib/required下的Hibernate包,导入mysql-connector-java的包。
第四步:建库,创建需要的mysql数据库,create database school;
第五步:建表,创建表create table stu(id int primary key auto_increment,name varchar(32),sex char,idcard varchar(32));
第六步:主配置文件hibernate.cfg.xml,编写配置文件放到项目的src目录之下(放入此目录的配置文件将在编译后自动放到bin目录下),配置文件如下

点击(此处)折叠或打开

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!--
  3.   ~ Hibernate, Relational Persistence for Idiomatic Java
  4.   ~
  5.   ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  6.   ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  7.   -->
  8. <!DOCTYPE hibernate-configuration PUBLIC
  9.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  10.         "">

  11. <hibernate-configuration>

  12.     <session-factory>

  13.         <!-- Database connection settings com.mysql.jdbc.Driver来自mysql-connector-java包-->
  14.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  15.         <property name="connection.url">jdbc:mysql://127.0.0.1:3306/school</property>
  16.         <property name="connection.username">root</property>
  17.         <property name="connection.password">7867761</property>

  18.         <!-- JDBC connection pool (use the built-in) -->
  19.         <!-- <property name="connection.pool_size">1</property>-->

  20.         <!-- SQL dialect -->
  21.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

  22.         <!-- Disable the second-level cache -->
  23.         <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

  24.         <!-- Echo all executed SQL to stdout -->
  25.         <property name="show_sql">true</property>

  26.         <!-- Drop and re-create the database schema on startup数据对象的四种操作方式
  27.                     create:表示启动的时候先drop,再create
                        create-drop: 也表示创建,只不过再系统关闭前执行一下drop
                        update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
                        validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
  28.          -->
  29.         <property name="hbm2ddl.auto">create</property>
  30.         <property name="log4j.logger.org.hibernate.type">trace</property>
  31.         <mapping resource="config/Test.hbm.xml"/>
  32.     </session-factory>
  33. </hibernate-configuration>
第七步:创建Hibernate Session对象

点击(此处)折叠或打开

  1. public static void main( String[] args )
  2. {
    1. System.out.print("测试开始");
    2. final StandardServiceRegistryBuilder _builder = new StandardServiceRegistryBuilder();
    3. final StandardServiceRegistry registry = _builder.configure("hibernate.cfg.xml")
    4. .build();
    5. Transaction _Transaction = null;
    6. try
    7. {
      1. MetadataSources source = new MetadataSources(registry);
      2. org.hibernate.boot.Metadata md = source.buildMetadata();
      3. SessionFactory _Factory = md.buildSessionFactory();
      4. Session _Session = _Factory.openSession();
      5. _Transaction = _Session.beginTransaction();
      6. _Transaction.begin();
      7. _Transaction.commit();
    8. }
    9. catch( Exception _e )
    10. {
      1. if( _Transaction != null )
      2. _Transaction.rollback();
      3. System.out.print( _e.getMessage());
    11. }
    12. return ;
  3. }
错误1:由于在编码时忘记传递MetadataSources source = new MetadataSources(registry);中registry 的参数出现如下错误

点击(此处)折叠或打开

  1. 十一月 04, 2015 9:40:05 上午 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService
  2. WARN: HHH000342: Could not obtain connection to query metadata : The application must supply JDBC connections
  3. Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
错误2:hibernate.cfg.xml中的jdbc:mysql://127.0.0.1:3306/school的school配置成了stu导致

点击(此处)折叠或打开

  1. 测试开始十一月 04, 2015 9:44:07 上午 org.hibernate.Version logVersion
  2. INFO: HHH000412: Hibernate Core {5.0.2.Final}
  3. 十一月 04, 2015 9:44:07 上午 org.hibernate.cfg.Environment
  4. INFO: HHH000206: hibernate.properties not found
  5. 十一月 04, 2015 9:44:07 上午 org.hibernate.cfg.Environment buildBytecodeProvider
  6. INFO: HHH000021: Bytecode provider name : javassist
  7. 十一月 04, 2015 9:44:08 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager
  8. INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
  9. 十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
  10. WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
  11. 十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
  12. INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://127.0.0.1:3306/stu]
  13. 十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
  14. INFO: HHH000046: Connection properties: {user=root, password=****}
  15. 十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
  16. INFO: HHH000006: Autocommit mode: false
  17. 十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
  18. INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
  19. Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
由于这类错误非常难于寻找原因,因为我为程序加入了catch语句,来捕获了异常,如果去掉catch,由于eclipse输出的异常后的堆栈信息

点击(此处)折叠或打开

  1. Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
  2. at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
  3. at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
  4. at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
  5. at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
  6. at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
  7. at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
  8. at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
  9. at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
  10. at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
  11. at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
  12. at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
  13. at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
  14. at org.hibernate.boot.MetadataSources.buildMetadata(MetadataSources.java:179)
  15. at test.HibernateTest.main(HibernateTest.java:21)
  16. Caused by: org.hibernate.exception.SQLGrammarException: Error calling Driver#connect
  17. at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
  18. at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:101)
  19. at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:123)
  20. at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
  21. at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
  22. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:89)
  23. at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
  24. at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
  25. at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
  26. at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
  27. at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
  28. at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
  29. at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
  30. at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
  31. ... 13 more
  32. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'stu'
  33. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  34. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  35. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  36. at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  37. at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
  38. at com.mysql.jdbc.Util.getInstance(Util.java:387)
  39. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
  40. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)
  41. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
  42. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
  43. at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1686)
  44. at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1207)
  45. at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254)
  46. at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285)
  47. at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084)
  48. at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:795)
  49. at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44)
  50. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  51. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  52. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  53. at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  54. at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
  55. at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
  56. at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
  57. at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
  58. ... 23 more
错误原因非常明确 数据库不存在
  1. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'stu'
第八步:创建orm对象

点击(此处)折叠或打开

  1. package test;

  2. public class stu {

  3.     private int id;
  4.     private String name;
  5.     private char sex;
  6.     private String idcard;
  7.     public stu( )
  8.     {
  9.         
  10.     }
  11.     public void setId( int _id )
  12.     {
  13.         id = _id;
  14.     }
  15.     public void setName( String _name )
  16.     {
  17.         name= _name;
  18.     }
  19.     public void setSex(char _sex )
  20.     {
  21.         sex = _sex;
  22.     }
  23.     public void setIdCard( String _idcard )
  24.     {
  25.         idcard= _idcard;
  26.     }
  27.     public int getId( )
  28.     {
  29.         return id;
  30.     }
  31.     public String getName( )
  32.     {
  33.         return name;
  34.     }
  35.     public char getSex( )
  36.     {
  37.         return sex;
  38.     }
  39.     public String getIdcard( )
  40.     {
  41.         return idcard;
  42.     }
  43. }
第九步:编写对象映射文件,在src下创建config文件夹,创建Test.hbm.xml文件,文件内容如下

点击(此处)折叠或打开

  1. <?xml version="1.0"?>

  2. <!--
  3.   ~ Hibernate, Relational Persistence for Idiomatic Java
  4.   ~
  5.   ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  6.   ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  7.   -->
  8. <!DOCTYPE hibernate-mapping PUBLIC
  9.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  10.         "">

  11. <hibernate-mapping package="test">

  12.     <class name="stu" table="stu">
  13.         <id name="id" column="id">
  14.             <generator class="identity"/>
  15.              

  16.         </id>

  17.         <property name="name" type="java.lang.String" column="name"/>
  18.         <property name="sex" type="java.lang.Character" column="sex"/>
  19.        <property name="idcard" type="java.lang.String" column="idcard"/>
  20.         
  21.     </class>

  22. </hibernate-mapping>

点击(此处)折叠或打开

  1. <!-- 主键的生成方式,不同的数据库采用不同的生成方式
  2.             sequence :oracle专用需要
  3.                           <generator class = "sequence">
  4.                                 <param name="sequence">
  5.                                 序列名
  6.                                 </param>
  7.                           </generator>
  8.             identiy :oracel之外的数据库主键生成方式
  9.             native :让hibernate自动选择主键生成方式 ,根据hibernate.cfg.xml中配置的方言来区分,配置方式与sequence一样
  10.             increment :让hibernate自主生成主键,通过读取表中的最大ID来生成,但当数据库并发量大时,会出现重复的主键,不推荐使用
  11.   assinged :程序员自己生成主键,不自动生成
  12.             hilo/uuid :通过uuid/hilo的算法生成一个长字符串,不会重复,但没有任何规律。
  13.             -->


第十步:添加代码为stu表添加一行记录

点击(此处)折叠或打开

  1.             _Transaction = _Session.beginTransaction();
  2.             _Transaction.begin();
  3.             stu _stu = new stu();
  4.             _stu.setName("李正杨");
  5.             _stu.setSex('B');
  6.             _stu.setIdCard("130624198723053342");
  7.             _Session.save( _stu );
  8.             _Transaction.commit();

运行后,异常如下

点击(此处)折叠或打开

  1. Exception in thread "main" org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
  2. at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123)
  3. at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
  4. at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:346)
  5. at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
  6. at org.hibernate.boot.internal.MetadataImpl.buildSessionFactory(MetadataImpl.java:170)
  7. at test.HibernateTest.main(HibernateTest.java:22)
  8. Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
  9. at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91)
  10. at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116)
  11. at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:388)
  12. at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:508)
  13. at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:124)
  14. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  15. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  16. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  17. at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  18. at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
  19. ... 5 more
  20. Caused by: java.lang.reflect.InvocationTargetException
  21. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  22. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  23. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  24. at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  25. at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88)
  26. ... 14 more
  27. Caused by: org.hibernate.PropertyNotFoundException: Could not locate setter method for property [test.stu#idcard]
  28. at org.hibernate.internal.util.ReflectHelper.findSetterMethod(ReflectHelper.java:475)
  29. at org.hibernate.property.access.internal.PropertyAccessBasicImpl.(PropertyAccessBasicImpl.java:44)
  30. at org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)
  31. at org.hibernate.mapping.Property.getGetter(Property.java:299)
  32. at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:270)
  33. at org.hibernate.tuple.entity.AbstractEntityTuplizer.(AbstractEntityTuplizer.java:145)
  34. at org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:63)
错误原因非常明确
Could not locate setter method for property [test.stu#idcard]
Set函数写的不符合规范,这里需要说明一下hibernate的映射格式,set####,get####其中####代表的是属性,一定要与定义的属性一致,包括大小写,第一个字母除外。
修改错误如下将大写的C改成小写调用处也修改

点击(此处)折叠或打开

  1.     public void setIdcard( String _idcard )
  2.     {
  3.         idcard= _idcard;
  4.     }

点击(此处)折叠或打开

            stu _stu = new stu();
            _stu.setName("李正杨");
            _stu.setSex('B');
            _stu.setIdcard("130624198723053342");
            _Session.save( _stu );
第十一步:重新运行成功

点击(此处)折叠或打开

  1. Hibernate: drop table if exists stu
  2. Hibernate: create table stu (id integer not null, name varchar(255), sex char(1), idcard varchar(255), primary key (id))
  3. 十一月 04, 2015 10:08:25 上午 org.hibernate.tool.hbm2ddl.SchemaExport execute
  4. INFO: HHH000230: Schema export complete
  5. Hibernate: select max(id) from stu
  6. Hibernate: insert into stu (name, sex, idcard, id) values (?, ?, ?, ?
这也验证了Create模式下,确实是先删除表,再创建表,然后插入了一行记录。







阅读(1167) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Hibernate隐秩序系列之---hql查询

给主人留下些什么吧!~~