hibernate 技术学习笔记(第一篇)

news/2024/7/4 3:02:45

引入:
模型不匹配(阻抗不匹配)
java面向对象语言,对象模型,其主要概念有:继承,关联,多态等;数据库是关系模型,其主要概念有:表,主键,外键等。
解决方法:
1.使用JDBC手工转换
2.使用ORM(object relation mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate,TopLink,OJB


技术:
SessionFactoroy 类似于jdbc中的DriverManager,通过sessionFactory获得的session类似于jdbc中获得的数据库连接connection。
在jdbc中事务是自动提交的,每一条语句默认就是一个事务。而在hibernate中,事务是默认关闭的,所以要手动的开启事务Transaction。
 <property name="hibernate.hbm2ddl.auto">create</property>  自动创建数据库表,该属性有四个取值:create-drop(多用于测试,程序启动创建表,运行结束删掉表,在真实的情况下,不应使用),create(在启动前把表删掉),update,validate

注意:在做试验时,有可能未提交事务,表中也插入了数据。可能是跟你使用的数据库有关。你的数据库的存储引擎是MyISAM的话,它不支持事务和外键。当你在程序中未使用过事务时,它同样能够把数据更新到表中。mysql3.23的默认存储引擎就是MyISAM.如果你的数据库存储引擎是InnoDB的话,它支持事务的回滚,外键,行级锁定等。在你的程序中未使用事务的话,他一开始把数据更新到表中,但是没有遇到提交事务的语句,所以就把该操作进行回滚了,所以在表中看不到更新的结果。mysql的较新版本的存储引擎用的都是InnoDB,性能更好。

开发流程:
 由domain object->mapping->db(官方推荐)
 由db开始,用工具生成mapping和domain object(开发中使用较多)
 由映射文件开始。


Domain Object的限制:
1,默认的构造方法(必须的,受内部机制影响,反射需要不带参数的构造方法)
2,有无意义的标识符id(主键)(可选)
3,非final的,对懒加载有影响(可选)

持久化对象(Persistent Object)及其集合(Collection)
生命期短促的单线程的对象,包含了持久化状态和商业功能。它们可能是普通的JavaBeans,唯一特别的是他们现在从属于且仅从属于一个Session。

获得session连接:
(1)使用户自行提供的jdbc连接
 SessionFactory可以使用一个用户自行提供的JDBC连接来打开一个Session。这种设计可以让应用程序来自己管理JDBC连接。应用程序必须小心,不能在同一个连接上打开多个并行的session。

java.sql.Connection conn = datasource.getConnection();
Session sess = sessions.openSession(conn);

// start a new transaction (optional)
Transaction tx = sess.beginTransaction();

 

(2)使用hibernate提供的jdbc连接
可以让SessionFactory替你打开连接。SessionFactory必须事先知道连接的参数,有几种不同的方法设置参数:
1,传递一个java.util.Properties到Configuration.setProperties()方法。
2,在classpath的根目录中提供hibernate.properties文件。
3,通过java -Dproperty=value指定使用系统属性。
4,在hibernate.cfg.xml文件中包含<property>元素。这个文件应该放在你的CLASSPATH的根目录中。 
如果你使用这种方法,打开一个Session是非常简单的:

Session sess = sessions.openSession(); // obtain a JDBC connection and
                                       // instantiate a new Session
// start a new transaction (optional)
Transaction tx = sess.beginTransaction();
 

系统级别的配置只能通过java -Dproperty=value或者在hibernate.properties文件中配置,而不能通过传递给Configuration的Properties实例来配置。

方言:
如果你不需要使用基于native或者sequence的主键自动生成算法,或者悲观锁定(使用Session.lock() 或 Query.setLockMode())的话,方言就可以不必指定。然而,假若你指定了一个方言,Hibernate会为上面列出的一些属性使用特殊默认值,省得你手工指定它们。

绑定SessionFactory到JNDI
假若你希望把SessionFactory绑定到一个JNDI命名空间,用hibernate.session_factory_name这个属性指定一个名字(比如,java:comp/env/hibernate/SessionFactory)。如果这个属性省略了,SessionFactory不会被绑定到JNDI。(在一个只读的JNDI默认值实现的环境中,这特别有用。比如,Tomcat。)

当把SessionFactory 绑定到JNDI,Hibernate会使用hibernate.jndi.url,hibernate.jndi.class的值来获得一个初始化上下文的实例。如果他们没有指定,就会使用默认的InitialContext。

如果你选择使用JNDI,EJB或者其他工具类就可以通过JNDI查询得到SessionFactory。


http://www.niftyadmin.cn/n/2864078.html

相关文章

hibernate学习之第二篇

持久化三个要点&#xff1a; 1&#xff0c;为持久化字段声明访问器(accessors)和是否可变的标志(mutators) 属性不一定需要声明为public的。Hibernate可以对default,protected或者private的get/set方法对的属性一视同仁地执行持久化。 2&#xff0c;实现一个默认的构造方法…

hibernate学习之第三篇(映射文件的配置)

如果不希望使用默认的hibernate.cfg.xml 文件作为配置文件&#xff0c;我们也可以指定配置文件名&#xff1a; File file new File("C:\\myhibernate.xml"); Configuration config new Configuration().configure(file); <classname"ClassName" …

Redis——redis的安装以及实现redis的主从复制

一.什么是redis redis是一个开源的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据路&#xff0c;高速缓存和消息队列的代理。支持字符串&#xff0c;哈希表&#xff0c;列表&#xff0c;集合&a…

hibernate学习之第四篇(对象状态)

session 的几个主要方法&#xff1a; 1&#xff0c;save方法和persist方法的区别&#xff1b; 2&#xff0c;delete&#xff0c;删除对象 3&#xff0c;update&#xff0c;更新对象&#xff0c;如果数据库中没有记录&#xff0c;会出现异常。 4&#xff0c;get&#xff0c;根据…

hibernate学习之第五篇

1&#xff0c; oracle数据库中&#xff0c;user是关键字&#xff0c;如果用户的表名为user会引起冲突。采取的方法主要有两种&#xff1a; ①如果可以修改表名&#xff0c;最好改变表名为tuser或其他的名字&#xff0c;免得引起麻烦。 ②如果表名不能修改&#xff0c;那么可以…

深入浅出hibernate摘录

以下摘自深入浅出hibernate&#xff1a; DAO模式中&#xff0c;数据库访问层实现被隐藏到Data Accessor中&#xff0c;前面说过&#xff0c;DAO模式实际上是两个模式的组合&#xff0c;即Data Accessor和domain Object模式。 何谓Data Accessor&#xff1f;即将数据访问的实现…

动态代理模式使用初探

jdk文档&#xff1a; 写道动态代理类&#xff08;以下简称为代理类&#xff09;是一个实现在创建类时在运行时指定的接口列表的类&#xff0c;该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程…

深入浅出hibernate摘录2

以下内容摘自深入浅出hibernate 在编写代码的时候&#xff0c;尽量将POJO的getter/setter方法设定为public&#xff0c;如果设定为private&#xff0c;protected&#xff0c;hibernate将无法对属性的存取进行优化&#xff0c;只能转而采用传统的反射机制进行操作&#xff08;hi…