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目录下),配置文件如下
-
<?xml version='1.0' encoding='utf-8'?>
-
<!--
-
~ Hibernate, Relational Persistence for Idiomatic Java
-
~
-
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
-
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-
-->
-
<!DOCTYPE hibernate-configuration PUBLIC
-
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
-
"">
-
-
<hibernate-configuration>
-
-
<session-factory>
-
-
<!-- Database connection settings com.mysql.jdbc.Driver来自mysql-connector-java包-->
-
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
-
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/school</property>
-
<property name="connection.username">root</property>
-
<property name="connection.password">7867761</property>
-
-
<!-- JDBC connection pool (use the built-in) -->
-
<!-- <property name="connection.pool_size">1</property>-->
-
-
<!-- SQL dialect -->
-
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
-
-
<!-- Disable the second-level cache -->
-
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
-
-
<!-- Echo all executed SQL to stdout -->
-
<property name="show_sql">true</property>
-
-
<!-- Drop and re-create the database schema on startup数据对象的四种操作方式
-
create:表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
-
-->
-
<property name="hbm2ddl.auto">create</property>
-
<property name="log4j.logger.org.hibernate.type">trace</property>
-
<mapping resource="config/Test.hbm.xml"/>
-
</session-factory>
-
</hibernate-configuration>
第七步:创建Hibernate Session对象
点击(此处)折叠或打开
-
public static void main( String[] args )
-
{
-
System.out.print("测试开始");
-
final StandardServiceRegistryBuilder _builder = new StandardServiceRegistryBuilder();
-
final StandardServiceRegistry registry = _builder.configure("hibernate.cfg.xml")
-
.build();
-
Transaction _Transaction = null;
-
try
-
{
-
MetadataSources source = new MetadataSources(registry);
-
org.hibernate.boot.Metadata md = source.buildMetadata();
-
SessionFactory _Factory = md.buildSessionFactory();
-
Session _Session = _Factory.openSession();
-
_Transaction = _Session.beginTransaction();
-
_Transaction.begin();
-
_Transaction.commit();
-
}
-
catch( Exception _e )
-
{
-
if( _Transaction != null )
-
_Transaction.rollback();
-
System.out.print( _e.getMessage());
-
}
-
return ;
-
}
错误1:由于在编码时忘记传递MetadataSources source = new MetadataSources(registry);中registry 的参数出现如下错误
-
十一月 04, 2015 9:40:05 上午 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService
-
WARN: HHH000342: Could not obtain connection to query metadata : The application must supply JDBC connections
-
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导致
-
测试开始十一月 04, 2015 9:44:07 上午 org.hibernate.Version logVersion
-
INFO: HHH000412: Hibernate Core {5.0.2.Final}
-
十一月 04, 2015 9:44:07 上午 org.hibernate.cfg.Environment
-
INFO: HHH000206: hibernate.properties not found
-
十一月 04, 2015 9:44:07 上午 org.hibernate.cfg.Environment buildBytecodeProvider
-
INFO: HHH000021: Bytecode provider name : javassist
-
十一月 04, 2015 9:44:08 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager
-
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
-
十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
-
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
-
十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
-
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://127.0.0.1:3306/stu]
-
十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
-
INFO: HHH000046: Connection properties: {user=root, password=****}
-
十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
-
INFO: HHH000006: Autocommit mode: false
-
十一月 04, 2015 9:44:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
-
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
-
Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
由于这类错误非常难于寻找原因,因为我为程序加入了catch语句,来捕获了异常,如果去掉catch,由于eclipse输出的异常后的堆栈信息
-
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
-
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
-
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
-
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
-
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
-
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
-
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
-
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
-
at org.hibernate.boot.MetadataSources.buildMetadata(MetadataSources.java:179)
-
at test.HibernateTest.main(HibernateTest.java:21)
-
Caused by: org.hibernate.exception.SQLGrammarException: Error calling Driver#connect
-
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
-
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:101)
-
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:123)
-
at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
-
at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
-
at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:89)
-
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
-
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
-
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
-
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
-
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
-
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
-
... 13 more
-
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'stu'
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
-
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
-
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
-
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
-
at com.mysql.jdbc.Util.getInstance(Util.java:387)
-
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
-
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)
-
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
-
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
-
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1686)
-
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1207)
-
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254)
-
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285)
-
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084)
-
at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:795)
-
at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44)
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
-
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
-
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
-
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
-
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
-
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
-
at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
-
... 23 more
错误原因非常明确 数据库不存在
-
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'stu'
第八步:创建orm对象
-
package test;
-
-
public class stu {
-
-
private int id;
-
private String name;
-
private char sex;
-
private String idcard;
-
public stu( )
-
{
-
-
}
-
public void setId( int _id )
-
{
-
id = _id;
-
}
-
public void setName( String _name )
-
{
-
name= _name;
-
}
-
public void setSex(char _sex )
-
{
-
sex = _sex;
-
}
-
public void setIdCard( String _idcard )
-
{
-
idcard= _idcard;
-
}
-
public int getId( )
-
{
-
return id;
-
}
-
public String getName( )
-
{
-
return name;
-
}
-
public char getSex( )
-
{
-
return sex;
-
}
-
public String getIdcard( )
-
{
-
return idcard;
-
}
-
}
第九步:编写对象映射文件,在src下创建config文件夹,创建Test.hbm.xml文件,文件内容如下
-
<?xml version="1.0"?>
-
-
<!--
-
~ Hibernate, Relational Persistence for Idiomatic Java
-
~
-
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
-
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-
-->
-
<!DOCTYPE hibernate-mapping PUBLIC
-
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-
"">
-
-
<hibernate-mapping package="test">
-
-
<class name="stu" table="stu">
-
<id name="id" column="id">
-
<generator class="identity"/>
-
-
</id>
-
-
<property name="name" type="java.lang.String" column="name"/>
-
<property name="sex" type="java.lang.Character" column="sex"/>
-
<property name="idcard" type="java.lang.String" column="idcard"/>
-
-
</class>
-
-
</hibernate-mapping>
-
<!-- 主键的生成方式,不同的数据库采用不同的生成方式
-
sequence :oracle专用需要
-
<generator class = "sequence">
-
<param name="sequence">
-
序列名
-
</param>
-
</generator>
-
identiy :oracel之外的数据库主键生成方式
-
native :让hibernate自动选择主键生成方式 ,根据hibernate.cfg.xml中配置的方言来区分,配置方式与sequence一样
-
increment :让hibernate自主生成主键,通过读取表中的最大ID来生成,但当数据库并发量大时,会出现重复的主键,不推荐使用
-
assinged :程序员自己生成主键,不自动生成
-
hilo/uuid :通过uuid/hilo的算法生成一个长字符串,不会重复,但没有任何规律。
-
-->
-
第十步:添加代码为stu表添加一行记录
-
_Transaction = _Session.beginTransaction();
-
_Transaction.begin();
-
stu _stu = new stu();
-
_stu.setName("李正杨");
-
_stu.setSex('B');
-
_stu.setIdCard("130624198723053342");
-
_Session.save( _stu );
-
_Transaction.commit();
运行后,异常如下
-
Exception in thread "main" org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
-
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123)
-
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
-
at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:346)
-
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
-
at org.hibernate.boot.internal.MetadataImpl.buildSessionFactory(MetadataImpl.java:170)
-
at test.HibernateTest.main(HibernateTest.java:22)
-
Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
-
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91)
-
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116)
-
at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:388)
-
at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:508)
-
at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:124)
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
-
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
-
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
-
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
-
... 5 more
-
Caused by: java.lang.reflect.InvocationTargetException
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
-
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
-
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
-
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
-
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88)
-
... 14 more
-
Caused by: org.hibernate.PropertyNotFoundException: Could not locate setter method for property [test.stu#idcard]
-
at org.hibernate.internal.util.ReflectHelper.findSetterMethod(ReflectHelper.java:475)
-
at org.hibernate.property.access.internal.PropertyAccessBasicImpl.(PropertyAccessBasicImpl.java:44)
-
at org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)
-
at org.hibernate.mapping.Property.getGetter(Property.java:299)
-
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:270)
-
at org.hibernate.tuple.entity.AbstractEntityTuplizer.(AbstractEntityTuplizer.java:145)
-
at org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:63)
错误原因非常明确
Could not locate setter method for property [test.stu#idcard]
Set函数写的不符合规范,这里需要说明一下hibernate的映射格式,set####,get####其中####代表的是属性,一定要与定义的属性一致,包括大小写,第一个字母除外。
修改错误如下将大写的C改成小写调用处也修改
-
public void setIdcard( String _idcard )
-
{
-
idcard= _idcard;
-
}
stu _stu = new stu();
_stu.setName("李正杨");
_stu.setSex('B');
_stu.setIdcard("130624198723053342");
第十一步:重新运行成功
-
Hibernate: drop table if exists stu
-
Hibernate: create table stu (id integer not null, name varchar(255), sex char(1), idcard varchar(255), primary key (id))
-
十一月 04, 2015 10:08:25 上午 org.hibernate.tool.hbm2ddl.SchemaExport execute
-
INFO: HHH000230: Schema export complete
-
Hibernate: select max(id) from stu
-
Hibernate: insert into stu (name, sex, idcard, id) values (?, ?, ?, ?
这也验证了Create模式下,确实是先删除表,再创建表,然后插入了一行记录。
阅读(1167) | 评论(0) | 转发(0) |