Hibernate学习之使用实例
2015-07-30 22:26
429 查看
下载
下载方式各异,有人喜欢直接自己来下需要的包,也有人使用M***EN,还有人喜欢直接下Hibernate,然后解压,找到里面的lib文件夹,里面包括了使用Hibernate的依赖包。本人使用的是最后一种。如果使用第一种,可能会遇到缺少各种包的情况,附录中列出了一些包的下载地址。下载地址:
http://nchc.dl.sourceforge.net/project/hibernate/hibernate4/4.3.10.Final/hibernate-release-4.3.10.Final.tgz
Build Path
下载后,找到lib文件夹下的required文件夹,然后把这个文件夹下的jar包都放到项目里的lib文件夹下,然后再 Build Path加入jar包引用。MySQL
我用到的数据库是MySQL,数据库名为forconsumer,表名是seed。表的结构如下:[code]mysql> show columns from seed; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | seed_id | int(11) | NO | PRI | NULL | auto_increment | | seed_site | varchar(200) | YES | | NULL | | | seed_proid | varchar(32) | YES | | NULL | | | seed_is_used | tinyint(4) | YES | | NULL | | +--------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
构建实体类
[code]package model; /** * 种子表Seed类 - - * 此类规则: * 1、此类也称为POJO类,不能继承任何类,也不实现任何接口 * 2、要有一个默认构造器 * 3、有getXXX和setXXX方法,属性均为private * @author young * */ public class Seed { private int seed_id; private String seed_site; private String seed_proid; private byte seed_is_used; //byte对应MySQL里的TINYINT数据类型 public Seed(){} public Seed(String seed_site, String seed_proid, byte seed_is_used){ this.seed_site = seed_site; this.seed_proid = seed_proid; this.seed_is_used = seed_is_used; } public int getSeed_id(){ return this.seed_id; } public void setSeed_id(int seed_id){ this.seed_id = seed_id; } public String getSeed_site(){ return this.seed_site; } public void setSeed_site(String seed_site){ this.seed_site = seed_site; } public String getSeed_proid(){ return this.seed_proid; } public void setSeed_proid(String seed_proid){ this .seed_proid = seed_proid; } public byte getSeed_is_used(){ return this.seed_is_used; } public void setSeed_is_used(byte seed_is_used){ this.seed_is_used = seed_is_used; } }
操作数据库类
[code]package dbhelper; import java.util.Iterator; import java.util.List; import model.Seed; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class ManageSeed { private static SessionFactory factory = null; static { factory = new Configuration().configure().buildSessionFactory(); } /** * * @param seed * @return */ public Integer addSeed(Seed seed){ Session session = factory.openSession(); Transaction ts = null ; Integer id = null ; try{ ts = session.beginTransaction(); id = (Integer) session.save(seed); ts.commit(); } catch(HibernateException he){ if(ts != null) ts.rollback(); he.printStackTrace(); } finally{ session.close(); } return id; } public void listSeed(){ Session session = factory.openSession(); Transaction ts = null; try{ ts = session.beginTransaction(); List lstSeed = session.createQuery(" From Seed ").list(); for(Iterator itr = lstSeed.iterator();itr.hasNext();){ Seed seed = (Seed) itr.next(); System.out.println("------------------------"); System.out.println(" seed_id : " + seed.getSeed_id()); System.out.println(" seed_site: " + seed.getSeed_site()); System.out.println(" seed_proid: " + seed.getSeed_proid()); System.out.println(" seed_is_used: " + seed.getSeed_is_used()); } ts.commit(); } catch(HibernateException he){ if( ts != null) ts.rollback(); he.printStackTrace(); } finally{ session.close(); } } }
重要的配置文件
hibernate.cfg.xml配置如下:[code]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- MySQL对应的 hibernate.dialect是org.hibernate.dialect.MySQLDialect 不同类型的数据库对应不同的Dialect --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- 配置连接URL,forconsumer是数据库的名字 --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/forconsumer </property> <property name="hibernate.connection.username"> root </property> <property name="hibernate.connection.password"> *****(此处直接填密码) </property> <!-- XML mapping files 列表 --> <!-- 种子表Seed --> <mapping resource="Seed.hbm.xml"/> <!-- 产品表Product --> <!-- <mapping resource="Product.hbm.xml"/> --> </session-factory> </hibernate-configuration>
Seed.hbm.xml配置如下:
[code]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 这里的name要写全称,即包括包名,否则会提示找不到类 --> <class name="model.Seed" table="seed"> <!-- 元数据,介绍类的相关信息 --> <meta attribute="class-description"> This class contains the seed detail. </meta> <id name="seed_id" type="int" column="seed_id"> <!-- generator 指示此字段自动增长 --> <generator class="native"/> </id> <!-- name表示类中的属性,column表示在数据库中的字段名,type为数据类型 --> <property name="seed_site" column="seed_site" type="string"/> <property name="seed_proid" column="seed_proid" type="string"/> <property name="seed_is_used" column="seed_is_used" type="byte"/> </class> </hibernate-mapping>
总结:首先,Hibernate真的很强大,很实用,也比较简单,最重要的几个部分为:配置文件和POJO类。还有一个比较容易犯的错就是,如果表名首字母是小写字母,在创建查询的时候,很容易写成” from seed “,这样的话,就会出现异常1的情况。
异常
异常1
[code]INFO: HHH000397: Using ASTQueryTranslatorFactory org.hibernate.hql.internal.ast.QuerySyntaxException: seed is not mapped [ From seed ] at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96) at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836) at dbhelper.ManageSeed.listSeed(ManageSeed.java:53) at main.Main.main(Main.java:36) Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: seed is not mapped at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95) at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:338) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3678) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) ... 9 more
解决方法
我的查询语句是:List lstSeed = session.createQuery(” From seed “).list();
虽然我的表名是seed,首字母小写,但在这里,必须写成Seed,即首字母大写。这是因为,此处的查询语句与我们平时用的SQL是不一样的,Hibernate有自己的HQL,这里的From Seed中的Seed是指类,而非SQL中的表,这条语句是说:返回所有Seed类的实例,而非从Seed表中查询数据。当然也支持在Hibernate中使用SQL,只是换个方法调用,例如:session.createSQLQuery(“SELECT * FROM CATS”).list();
异常2
Exception in thread “main” java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager解决方法
加入hibernate-commons-annotations.jar异常3
Exception in thread “main” java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger解决方法
加入jboss-logging.jar异常4
Exception in thread “main” java.lang.NoClassDefFoundError: javax/transaction/SystemException解决方法
加入jta.jar附录
hibernate-core.jar下载地址:
http://search.maven.org/remotecontent?filepath=org/hibernate/hibernate-core/4.3.10.Final/hibernate-core-4.3.10.Final.jar
dom4j.jar
http://search.maven.org/remotecontent?filepath=org/dom4j/dom4j/2.0.0-RC1/dom4j-2.0.0-RC1.jar
xalan.jar
http://search.maven.org/remotecontent?filepath=xalan/xalan/2.7.2/xalan-2.7.2.jar
xerces.jar
http://search.maven.org/remotecontent?filepath=xerces/xerces/2.4.0/xerces-2.4.0.jar
commons-logging.jar
http://search.maven.org/remotecontent?filepath=commons-logging/commons-logging/1.2/commons-logging-1.2.jar
hibernate-commons-annotations.jar
http://search.maven.org/remotecontent?filepath=org/hibernate/common/hibernate-commons-annotations/5.0.0.Final/hibernate-commons-annotations-5.0.0.Final.jar
jboss-logging.jar
http://search.maven.org/remotecontent?filepath=org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar
jta.jar
http://search.maven.org/remotecontent?filepath=javax/transaction/jta/1.1/jta-1.1.jar
hibernate-jpa.jar
http://search.maven.org/remotecontent?filepath=org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.1.Final/hibernate-jpa-2.0-api-1.0.1.Final.jar
相关文章推荐
- 黑马程序员——java学习8(166-179)——集合,Collection,List
- 2015 Multi-University Training Contest 4 (hdu5338 ZZX and Permutations)线段树(好)
- spoj 1043 Can you answer these queries I(线段树)
- Ultra-QuickSort
- Android开发之两种方式实现连续点击两次返回键退出程序
- android 定时器的使用
- Perl为数组排序
- js如何判断一个对象是不是Array?
- MRC模式下生成的类对象自动使用 autorelease
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 最流行的Java应用服务器排行
- android 定时器的使用
- 单片机中C语言指针与变量
- jQuery实现对P标签的操作
- C++中的运算符重载
- 探讨Unity3d跨平台原理
- 点到圆弧的距离(csu1503)+几何
- android 定时器的使用
- android 定时器的使用
- hdu 5301(枚举) Buildings