2022年hibernate学习笔记 .pdf
《2022年hibernate学习笔记 .pdf》由会员分享,可在线阅读,更多相关《2022年hibernate学习笔记 .pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Domain object 限制:1 Domain 对象必须有一个不带参数的构造方法(必须的)因为 hibernate 创建对象的时候是调用的Newinstance 方法,这个方法必须有不带参数的构造方法。2 有无意义的标识符id(主键)(可选)3 非 final 的,对懒加载有影响(可选)配置实体表时,如果和数据库冲突,表名可以另起或者加上User 反引号( 1 左边那个键)注意:如果表已经创建,再去配置表的属性,不会对表属性有影响,所以一开始就要把表的约束性条件,字段设置好。1.domain.hbm.xml 的配置 /domain对象所处的包 /name是类名, table是数据库中对应的
2、表名 /id表示的是主键,name 是属性名, column是字段 /class表示的是主键默认值 此字段唯一 unique /缺省的 column的名字和属性名相同2.session的主要方法1.save,persist 保存数据, persist 在事务外不会产生insert 语句2.delete 删除对象3.update,更新对象,如果数据库中没有记录,会出现异常4.get,根据 id 查,会立刻访问数据库5.load,根据 id 查(返回的是代理,不会立即访问数据库)懒加载6SaveOrUpdate,merge(根据 id 和 version 的值来确定是save或 update)调用
3、 merge 你的对象还是脱管的7.lock(把对象变成持久对象,但不会同步对象的状态)3.实体对象的三种状态1.Transient(瞬时的)数据库中没有数据与之对应,超过作用域会被JVM 垃圾回收器回收,一般是new 出来且与 session没有关联的对象2.Persistent(持久的)数据库中有数据与之对象,当前与session有关联,并且相关联的session 没有关闭,事务没有提交;持久对象状态发生变化,在事务提交时,会影响到数据库(hibernate 能检测到)3.Detached(脱管的)数据库中有数据与之对应,但当前没有session与之关联,托管对象状态发生改变,hibern
4、ate 不能检测到。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - 4.实现复杂的查询HQL(Hibernate Query Language) 面向对象的查询语言,与SQL 不同, HQL 中的对象名是区分大小写的(除了JAVA 类和属性其他部分不区分大小写);HQL 中查的是对象而不是和表,并且支持多态;HQL 主要通过 Query 来操作, Query 的创建方式:Query q = session.createQuer
5、y(hql); from Person from User user where user.name=:name from User user where user.name=:name and user.birthday :birthday Criteria Criteria 是一种比 HQL 更面向对象的查询方式;Criteria 的创建方式:Criteria crit = session.createCriteria(DomainClass.class); 简单属性条件如:criteria.add(Restrictions.eq(propertyName, value), criteri
6、a.add(Restrictions.eqProperty(propertyName,otherPropertyName) staticvoid query(String name) Session session=null; try session=HibernateUtil.getSession(); / String hql=from User as user where user.name=?;/ Query que=session.createQuery(hql);/ que.setString(0, name);/* * 运用别名的方式设置参数 */String hql=from
7、User as user where user.name=:n; Query que=session.createQuery(hql); que.setString(n, name); que.setFirstResult(0); /实现分页查询设置起始记录的位置名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 19 页 - - - - - - - - - que.setMaxResults(2); /设置最多的记录数List user=que.list(); for(Us
8、er u: user) System.out .println(u.getBirthday(); / User us=(User)que.uniqueResult();/当查询的结果只有一个对象的时候可以用这个方法。/ System.out.println(us.getBirthday(); catch(HibernateException e) e.printStackTrace(); throw e; finally if(session!=null) session.close(); /* * 使用 criteria接口来查询 * 所拥有的方法和HQL基本相同 * param name
9、*/staticvoid criteria(String name) Session s=null; try s=HibernateUtil.getSession(); Criteria ca=s.createCriteria(User.class); ca.add(Restrictions.eq ( name, name); ca.add(Restrictions.le ( birthday, new Date(); List user=ca.list(); for(User u: user) System.out .println(u.getBirthday(); catch(Hibern
10、ateException e) throw e; 5.实体对象关联关系注意:多对一和一对多的关系都必须对其进行初始化不然将得到的是空值,因为用到了懒加载初始化过程:Hibernate.initialize(emp.getDepart(); /对多对一关系进行初始化Hibernate.initialize(depart.getEmp(); /对一对多关系进行初始化注意:1.多对一的关系映射Employee-Department 的关系映射多个员工有可能对应的是一个部门Employee 实体类名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
11、- - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - publicclass Employee privateintid ; private String name ; private Department depart; public Employee() Employee 实体映射文件的配置 /unique设置字段的唯一性/多对一的配置 name是实体类中的属性名,column是外键的列名 在类中的使用/* * 增加一个部门和一个该部门的员工。 * return */static Employee add() Session s=n
12、ull; Transaction tx=null; try s=HibernateUtil.getSession(); tx=s.beginTransaction(); Department depart=new Department(); depart.setName(new depatr1); Employee emp=new Employee(); emp.setDepart(depart); emp.setName(new Employee1); s .save(depart); /如果先保存员工,再保存部门,那么depart_id就会是默认空值,然后 hibernate会执行一条更新
13、语句,将id 加上去s.save(emp); / / 如果 depart_id设置了 not-null,那么这两个的顺序就不能换,不然就会报错。mit(); return emp; catch(HibernateException e) if(tx!=null) tx.rollback(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 19 页 - - - - - - - - - throw e; finally if(s!=null) s.close(); /* *
14、 根据员工 id 查询员工信息 * param id * return */static Employee getEmp(int id) Session s=null; try s=HibernateUtil.getSession(); Employee emp=(Employee)s.get(Employee.class, id); Hibernate.initialize(emp.getDepart(); /此处是懒加载,必须初始化一下return emp; catch(HibernateException e) throw e; finally if(s!=null) s.close()
15、; 2.一对多的关系映射Department-Employee 的关系映射一个部门有多个员工Department 实体类publicclass Department privateintid ; private String name ; private Set emp; public Department() Department 实体映射文件的配置 /实体类中的属性 /对应多类中的外键id /对应多的类名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 19 页 - -
16、- - - - - - - 在类中的使用/* * 根据 id 获取部门 * param id * return */static Department getDepart(int id) Session s=null; try s=HibernateUtil.getSession(); /获取实体对象Department depart=(Department)s.get(Department.class, id); Hibernate.initialize(depart.getEmp(); /此处懒加载, 对set 集合进行初始化return depart; catch(HibernateEx
17、ception e) throw e; finally if(s!=null) s.close(); 3.一对一的关系映射Person-IdCard 的关系映射一个人只有一个身份证Person 实体类publicclass Person privateintid ; private String name ; private IdCard idCard; public Person() IdCard 实体类publicclass IdCard privateintid ; private Date usefulDate; private Person person; public IdCard
18、() 实体映射文件的配置Person 实体名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - Idcard 实体person /constrained建立外键约束 在类中的使用/* * 增加一个人及其他的身份证 * * 一对一的关系映射 * return */static Person addOneToOne() Session s=null; Transaction tx=null; try s=HibernateUtil.ge
19、tSession(); tx=s.beginTransaction(); IdCard idCard=new IdCard(); idCard.setUsefulDate(new Date(); Person person=new Person(); person.setName(p2); person.setIdCard(idCard); idCard.setPerson(person); s.save(person); s.save(idCard); mit(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
20、 - - - - - - - 第 7 页,共 19 页 - - - - - - - - - return person; catch(HibernateException e) if(tx!=null) tx.rollback(); throw e; finally if(s!=null) s.close(); 4.多对多的关系映射Student-Teacher 的关系映射一个学生可以有多个老师教,一个老师也可以教多个学生Student 实体类publicclass Student privateintid ; private String name ; private Set teacher
21、s; public Student() Teacher 实体类publicclass Teacher privateintid ; private String name ; private Set students; public Teacher() 实体映射文件的配置Student 实体Teacher 实体名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 19 页 - - - - - - - - - 在类中的使用/* * 增加两个老师和两个学生 * 一个学生两个老师教
22、* 一个老师教两个学生 * return老师 */static Teacher addTeacher() Session s=null; Transaction tx=null; try s=HibernateUtil.getSession(); tx=s.beginTransaction(); Set ss=new HashSet(); Set st=new HashSet(); Teacher t1=new Teacher(); t1.setName(t1); st.add(t1); Teacher t2=new Teacher(); t2.setName(t2); st.add(t2);
23、 Student s1=new Student(); s1.setName(s1); ss.add(s1); Student s2=new Student(); s2.setName(s2); ss.add(s2); s.save(s1); s.save(s2); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 19 页 - - - - - - - - - s.save(t1); s.save(t2); t1.setStudents(ss); t2.setStudents
24、(ss); /s2.setTeachers(st);mit(); return t1; catch(HibernateException e) if(tx!=null) tx.rollback(); throw e; finally if(s!=null) s.close(); /* * 根据 id 查询得到一个学生 * 并返回了教这个学生的老师 * param id * return学生 */static Student getStudent(int id) Session s=null; try s=HibernateUtil.getSession(); Student st=(Stude
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年hibernate学习笔记 2022 hibernate 学习 笔记
限制150内