hibernate基本知识点

  • 格式:doc
  • 大小:86.50 KB
  • 文档页数:8

Hibernate基本知识点Hibernate介绍Hibernate的Hello WorldXml配置形式Annotation配置形式Hibernate原理的模拟,重点讲思路,代码不全部实现Hibernate的基本配置Hibernate常用类介绍与对象三种状态Hibernate数据库连接池配置Hibernate关系映射一对一一对多多对多Hibernate关系映射的增删改查Hibernate查询(HQL语句的使用)Hibernate条件查询(Criteria Queries)1.Hibernate介绍1)参考我画的hibernate结构图,结合官方文档结构图去理解2)是一个对象关系映射框架,对jdbc进行了轻量级的封装,可以让开发者以面OOP编程思维去持久化数据2.Hibernate的Hello World1)xml配置形式i.新建java项目hibernate01ii.引入hibernate4的相关包iii.引入oracle驱动包,建立student表iv.新建hibernate配置文件hibernate.cfg.xmla)从官方文档中copy样例b)修改相应的数据库连接,修改数据库方言c)注释掉暂时用不到的内容v.新建实体类Studentvi.新建实体类Student对应的映射文件vii.将映射文件添加到hibernate.cfg.xml中viii.编写测试类,注意hibernate3和hibernte4的写法不同i.Hibernate3:参考文档i.Hibernate4:cfg.configure();i.ServiceRegistryserviceRegistry = newServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();ii.用hibernate4测试的时候,当你的代码完全没有问题时,还是会报一些关于reflect反射的错误,但是数据还是insert进去了,替换一下oracle的驱动包为ojdbc6.jar就ok2)Annotation配置形式i.建立teacher表ii.新建Teacher实体类iii.在Teacher类上加上注解i.在类名上@Entity,在主键属性上加@IDiv.在hibernate.cfg.xml中添加Teacher类实体映射i.<mapping class="com.chinasoft.model.Teacher"/>,注意包名之间是点号v.编写测试类进行测试注意Hibernate3 xml配置和注解配置的区别:注解:Configuration cfg = new AnnotationConfiguration();cfg.configure().bulidSessionFactory();3.Hibernate原理模拟(了解)1)思路:客户新建了一个实体对象例如Student,调用session.save()方法,就帮我们把对象保存到了数据库中去,Hibernate框架中肯定是对这一块进行了封装,帮我们构造了sql语句。

2)模拟步骤:(1)模拟sql语句的创建(2)直接通过jdbc获取connection(3)模拟sql语句参数的注入,重点关注如何通过反射得到实体类属性的返回值。

(4)进行模拟测试4.Hibernate基本配置(重点)1)配置hibernate.cfg.xml: hbm2ddl.autoa)validate:加载hibernate时验证数据库表结构b)create:每次加载hibernate重新创建表结构,数据会丢失c)create-drop:加载hibernate创建表,session关闭时删除表结构d)update:加载hibernate时自动更新数据库表结构2)配置hibernate日志环境(了解)i.hibernate4采用的SLF4J(Simple Logging Façade for Java),已集成到框架里ii.hibernate3需要手动添加日志jia包3)hibernate.cfg.xml:show_sql、format_sql4)注解和xml文件详细1)表名和类名不一致2)字段名和属性名一致,注解默认是@Basic,xml形式参考文档3)字段名和属性名不一致,注解:在方法上加上@Column;xml:在property中加上column属性4)transient,注解为transient的属性都不被持久化,参考5.1.4.15) hibernate基本数据类型,参考docuemntation/manual/index.html/5.2 5.Hibernate主键生成策略(重点)常见的主键生成策略有increment、identity、sequence、uuid。

具体参见5.1.2.2.1Increment:在内存中生成主键,每次增量为1,不建议在集群中使用。

xml文件中这样使用:<generator class="native"></generator>annotation这样使用:@GeneratedValue(strategy=GenerationType.AUTO),默认是AUTO 注意各个主键生成策略的特点及使用范围当使用sequence时,数据库生成同一个sequence。

需要自定义sequence名字,请参考5.1.2.26.Hibernate常用类介绍与对象三种状态(重点)1)Configuration.configure(),默认读取hibernate.cfg.xml,可以重载configure()方法,如configure(“hibernate_.cfg.xml”)2)SessionFactory.openSession()与SessionFactory.getCurrentSession(),openSession()重新开一个session,getCurrentSession()为如果上下文中有session,就用原来的session,否则就新建一个session3)对象的三种状态:Transient,Persisent,Detached,参考11.11.Transient:使用构造方法构造出来的对象,没有和hibernate session关联2.Persisent:在数据库中存在记录,在session范围内3.Detached:已被持久化,但session关闭4)三种状态如何区分1.有没有主键id,没有主键id就是Transient状态2.有主键id,在session缓存中也有就是Persisent状态3.有主键id,在session缓存中没有就是Detached状态5)save()方法,参考hibernate API6)delete()方法,参考hibernate API7)load()与get()方法,参考文档11.2及API1.load()方法加载指定id对应的实体,当获取实体的某个属性时才发出sql语句;获取实体的属性必须在commit()方法之前,因为获取的实体是放在session缓存中的2.get()方法根据指定查询对应的实体3.load()与get()的异同点a)均是先从缓存中开始寻找,如果没有再去数据库中查询b)load方法是在获取对象的某个属性时才发出发出sql语句,get方法是在调用get()方法时就发出sql语句c)如果使用load()方法,必须在commit()方法之前d)如果查询一条id不存在的记录,load()方法报org.hibernate.ObjectNotFoundException,get()方法报ng.NullPointerException8)update9)SaveOrUpdate方法7.Hibernate数据库连接池配置(重点掌握怎么配置)1)数据库连接池的解释参考我画的连接池结构图2)Hibernate可使用的数据库连接池C3P0、Proxool、JNDI,重点掌握C3P0,其余只做了解3)C3P0的配置a)添加C3P0所需的jar包b)注释掉hibernate.cfg.xml的connection.pool_size属性c)在hibernate.cfg.xml中添加C3P0配置,参考文档3.3,其余保持不变8.Hibernate关系映射(重点)1)一对一(one-to-one)a)单向(unidirectional)i.annotation1.@OneToOne2.如果需要改变映射字段的名字,加上@JoinColumn(name=”[]”)ii.xml1.<many-to-one name="husband" column="husbandid"unique="true"></many-to-one>b)双向(bidirectional)i.annotation1.在需要做关系映射的实体上均加上@OneToOne2.若要取消其中一方的外键,这样写@OneToOne(mappedBy=”[]”)ii.Xml1.在另外一方加上<one-to-one name="wife"property-ref="husband"></one-to-one>2)多对一(many-to-one)a)单向(unidirectional)i.annotation1.在多的一方加上@ManyToOneii.Xml1.在多的一方加上<many-to-one name=”” column=””>b)双向(bidirectional)i.在多的一方加上@ManyToOneii.在一的一方加上@OneToMany @JoinColumn(name=””),此时会生成两个外键iii.若不想生成两个外键,在一的一方去掉@JoinColumn,在一的一方加上@OneToMany(mappedBy=””),引号的内容为多的一方中主表的属性3)一对多(one-to-many)a)单向(unidirectional)i.Annotation1.在一的一方加上多的一方的Set集合2.在一的一方加上@OneToMany,会生成中间表3.若不想生成中间表,要加上@JoinColumn(name=””),name的值为多的一方外键的列名ii.xml1.在一的一方加上<set name="students"><key column="teamid"></key><one-to-many class="Student"/></set>b)双向(bidirectional)i.同多对一的双向关联4)多对多(many-to-many)a)单向(unidirectional)i.annotation1.只在任何一方加上<many-to-many>2.若想改变中间表的名字或列名,这样写@ManyToMany@JoinTable(name="r_a",joinColumns={@JoinColumn(name="r_id")},inverseJoinColumns={@JoinColumn(name="a_id")})具体参考java ee apiii.xml1.具体参考文档8.4.39.Hibernate关系映射的增删改查(CRUD)(重点)(a)新增1)单向多对一1.设置对象之间的关系,保存两个对象。