[导入]Hibernate 学习笔记
Hibernate 百度百科 http://baike.baidu.com/view/7291.html?wtp=tt
摘要
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
下面对这五的核心接口分别加以介绍。
·Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
·SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
·Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
·Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
·Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
下面对这五的核心接口分别加以介绍。
·Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
·SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
·Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
·Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
·Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
精通Hibernate学习笔记NO.1 http://zpthomes.spaces.live.com/Blog/cns!6AB705608FFE25A3!334.entry
摘要
Hibernate是什么?从不同的角度有不同的解释:
1.它是连接Java应用程序和关系数据库的中间件.
2.它对JDBC API进行了封装,负责Java对象的持久化.
3.在分层的软件架构中它位于持久化层,封装了所有数据库访问细节,是业务逻辑层可以专注于实现业务逻辑.
4.它是一中ORM(对象关系模型)映射工具.能够建立面向对象的域模型和关系数据模型之间的映射.
持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API,完善的持久化层应该达到以下目标:
1.代码可重用性高,能够完成所有的数据库访问操作.
2.如果需要的话,能够支持多种数据库平台.
3.具有相对独立性,当持久层的实现发生变化时,不影响上层的实现.
Hibernate是什么?从不同的角度有不同的解释:
1.它是连接Java应用程序和关系数据库的中间件.
2.它对JDBC API进行了封装,负责Java对象的持久化.
3.在分层的软件架构中它位于持久化层,封装了所有数据库访问细节,是业务逻辑层可以专注于实现业务逻辑.
4.它是一中ORM(对象关系模型)映射工具.能够建立面向对象的域模型和关系数据模型之间的映射.
持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API,完善的持久化层应该达到以下目标:
1.代码可重用性高,能够完成所有的数据库访问操作.
2.如果需要的话,能够支持多种数据库平台.
3.具有相对独立性,当持久层的实现发生变化时,不影响上层的实现.
Hibernate 学习笔记 http://blog.csdn.net/kangwei8655990/archive/2007/04/13/1563706.aspx
第八章 Hibernate的入门 http://blog.csdn.net/weijie_search/archive/2008/03/13/2175917.aspx
摘要
10、如何学习Hibernate
(1)Hibernate文档
Hibernate文档处处都是持久层设计的经验和最佳实践。Hibernate文档准确的来说,绝大部分内容都在讲对象的持久层设计,而不是简单的Hibernate使用。
(2)学习要点
所以学习Hibernate,主要是在学习持久层的设计模式,如果你把Hibernate文档都看完了,还整天只会提那些 Hibernate的配置问题,Hibernate的类调用问题,我觉得这样的人还没有真正的入门,算是白学了
在学习Hibernate的时候即集中所有精力来理解Hibernate的运行原理,集中精力来掌握持久层设计应该把握的原则和技巧,这些才对我是最重用的东西----而如果在学习Hibernate时间,主要侧重于怎么配置,用工具怎么生成hbm文件,如果你把重点放在这里,基本上等于白学了Hibernate。
因为,如果这样进行学习,学习完Hibernate,肯定会对JDBC的编程也提高了一大截,更不要说对于J2EE架构的持久层的框架设计,基本上是了然于胸了,即使将来换了API,不用Hibernate的,改用JDO,Castor什么的,这些经验一样照用。
(3)Hibernate的精华:在于无与伦比的灵巧的对象持久层设计
这些持久层设计经验不会因为你不用Hibernate而丧失掉,我自己学习Hibernate,已经明显感觉到对持久层设计能力已经长了很多经验值了,这些经验甚至不光可以用在Java上,用在.net上也是一样。
因为,不管JDO也好,Hibernate也好,TopLink也好,CocoBase也好,还是Castor,还是什么Torque,OJB,软件的使用和配置方法可以各异,但本质上都是ORM,都是对JDBC的对象持久层封装,所以万变不离其宗。
10、如何学习Hibernate
(1)Hibernate文档
Hibernate文档处处都是持久层设计的经验和最佳实践。Hibernate文档准确的来说,绝大部分内容都在讲对象的持久层设计,而不是简单的Hibernate使用。
(2)学习要点
所以学习Hibernate,主要是在学习持久层的设计模式,如果你把Hibernate文档都看完了,还整天只会提那些 Hibernate的配置问题,Hibernate的类调用问题,我觉得这样的人还没有真正的入门,算是白学了
在学习Hibernate的时候即集中所有精力来理解Hibernate的运行原理,集中精力来掌握持久层设计应该把握的原则和技巧,这些才对我是最重用的东西----而如果在学习Hibernate时间,主要侧重于怎么配置,用工具怎么生成hbm文件,如果你把重点放在这里,基本上等于白学了Hibernate。
因为,如果这样进行学习,学习完Hibernate,肯定会对JDBC的编程也提高了一大截,更不要说对于J2EE架构的持久层的框架设计,基本上是了然于胸了,即使将来换了API,不用Hibernate的,改用JDO,Castor什么的,这些经验一样照用。
(3)Hibernate的精华:在于无与伦比的灵巧的对象持久层设计
这些持久层设计经验不会因为你不用Hibernate而丧失掉,我自己学习Hibernate,已经明显感觉到对持久层设计能力已经长了很多经验值了,这些经验甚至不光可以用在Java上,用在.net上也是一样。
因为,不管JDO也好,Hibernate也好,TopLink也好,CocoBase也好,还是Castor,还是什么Torque,OJB,软件的使用和配置方法可以各异,但本质上都是ORM,都是对JDBC的对象持久层封装,所以万变不离其宗。
(比较全面的介绍) http://feelingsea.blog.hexun.com/7294376_d.html
摘要
16、一个重要的术语:Type
(1)一个Type对象能将一个Java类型映射到数据库中一个表的字段中
Hibernate的设计者们发明了一个术语:Type,它在整个构架中是一个非常基础、有着强大功能的元素。一个Type对象能将一个Java类型映射到数据库中一个表的字段中去(实际上,它可以映射到表的多个字段中去)。
<hibernate-mapping>
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="increment"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
它是Hibernate mapping types,并不像我们假想的那样,是Java data type, 同时也不是SQL database type。这些类型被称作Hibernate mapping types,它们把数据类型从Java转换到SQL data types。
持久类的所有属性都对应一个type,这种设计思想使用Hibernate有着高度的灵活性和扩展性。
(2)关于缺省的type类型
如果映射的参数没有设置type类型,Hibernate也将尝试去确定正确的类型转换和它的映射类型。在某些情况下这个自动检测(在Java class上使用反射机制)不会产生你所期待或者需要的缺省值----因此,最好我们来设定其类型。
上面的例子是关于date属性。Hibernate无法知道这个属性应该被映射成下面这些类型中的哪一个: SQL date,timestamp,time。 我们通过声明属性映射timestamp来表示我们希望保存所有的关于日期和时间的信息。
16、一个重要的术语:Type
(1)一个Type对象能将一个Java类型映射到数据库中一个表的字段中
Hibernate的设计者们发明了一个术语:Type,它在整个构架中是一个非常基础、有着强大功能的元素。一个Type对象能将一个Java类型映射到数据库中一个表的字段中去(实际上,它可以映射到表的多个字段中去)。
<hibernate-mapping>
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="increment"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
它是Hibernate mapping types,并不像我们假想的那样,是Java data type, 同时也不是SQL database type。这些类型被称作Hibernate mapping types,它们把数据类型从Java转换到SQL data types。
持久类的所有属性都对应一个type,这种设计思想使用Hibernate有着高度的灵活性和扩展性。
(2)关于缺省的type类型
如果映射的参数没有设置type类型,Hibernate也将尝试去确定正确的类型转换和它的映射类型。在某些情况下这个自动检测(在Java class上使用反射机制)不会产生你所期待或者需要的缺省值----因此,最好我们来设定其类型。
上面的例子是关于date属性。Hibernate无法知道这个属性应该被映射成下面这些类型中的哪一个: SQL date,timestamp,time。 我们通过声明属性映射timestamp来表示我们希望保存所有的关于日期和时间的信息。
java,hibernate,标准sql数据类型之间的对应表 http://hi.baidu.com/sunjoe/blog/item/aa1ddabf07c5380f19d81feb.html
摘要
java数据类型,hibernate数据类型,标准sql数据类型之间的对应表
Java数据类型 Hibernate数据类型 标准SQL数据类型(PS:对于不同的DB可能有所差异)
byte、java.lang.Byte byte TINYINT
short、java.lang.Short short SMALLINT
int、java.lang.Integer integer INGEGER
long、java.lang.Long long BIGINT
float、java.lang.Float float FLOAT
double、java.lang.Double double DOUBLE
java.math.BigDecimal big_decimal NUMERIC
char、java.lang.Character character CHAR(1)
boolean、java.lang.Boolean boolean BIT
java.lang.String string VARCHAR
boolean、java.lang.Boolean yes_no CHAR(1)('Y'或'N')
boolean、java.lang.Boolean true_false CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date date DATE
java.util.Date、java.sql.Time time TIME
java.util.Date、java.sql.Timestamp timestamp TIMESTAMP
java.util.Calendar calendarTIMES TAMP
java.util.Calendar calendar_date DATE
byte[] binary VARBINARY、 BLOB
java.lang.String text CLOB
java.io.Serializable serializable VARBINARY、 BLOB
java.sql.Clob clob CLOB
java.sql.Blob blob BLOB
java.lang.Class class VARCHAR
java.util.Locale locale VARCHAR
java.util.TimeZone timezone VARCHAR
java.util.Currency currency VARCHAR
java数据类型,hibernate数据类型,标准sql数据类型之间的对应表
Java数据类型 Hibernate数据类型 标准SQL数据类型(PS:对于不同的DB可能有所差异)
byte、java.lang.Byte byte TINYINT
short、java.lang.Short short SMALLINT
int、java.lang.Integer integer INGEGER
long、java.lang.Long long BIGINT
float、java.lang.Float float FLOAT
double、java.lang.Double double DOUBLE
java.math.BigDecimal big_decimal NUMERIC
char、java.lang.Character character CHAR(1)
boolean、java.lang.Boolean boolean BIT
java.lang.String string VARCHAR
boolean、java.lang.Boolean yes_no CHAR(1)('Y'或'N')
boolean、java.lang.Boolean true_false CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date date DATE
java.util.Date、java.sql.Time time TIME
java.util.Date、java.sql.Timestamp timestamp TIMESTAMP
java.util.Calendar calendarTIMES TAMP
java.util.Calendar calendar_date DATE
byte[] binary VARBINARY、 BLOB
java.lang.String text CLOB
java.io.Serializable serializable VARBINARY、 BLOB
java.sql.Clob clob CLOB
java.sql.Blob blob BLOB
java.lang.Class class VARCHAR
java.util.Locale locale VARCHAR
java.util.TimeZone timezone VARCHAR
java.util.Currency currency VARCHAR
Hibernate 3.2 Integer --> Long
摘要
关于在Hibernate里使用select count(*) 返回值的问题说明
由于我使用的是Hibernate 3.2版本,经确认,这个版本已经把以前返回 Integer的改成了 Long,
因为JPA里面的返回值规定是Long, Hibernate为了兼容这个,所以修改了返回值。
如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。
这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。
Hibernate Team也提供了一个与原来兼容的解决方案:
Configuration classicCfg = new Configuration();
classicCfg.addSqlFunction( "count", new ClassicCountFunction());
classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
SessionFactory classicSf = classicCfg.buildSessionFactory();
关于在Hibernate里使用select count(*) 返回值的问题说明
由于我使用的是Hibernate 3.2版本,经确认,这个版本已经把以前返回 Integer的改成了 Long,
因为JPA里面的返回值规定是Long, Hibernate为了兼容这个,所以修改了返回值。
如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。
这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。
Hibernate Team也提供了一个与原来兼容的解决方案:
Configuration classicCfg = new Configuration();
classicCfg.addSqlFunction( "count", new ClassicCountFunction());
classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
SessionFactory classicSf = classicCfg.buildSessionFactory();