hibernate学习笔记.docx
- 文档编号:30499942
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:31
- 大小:64.45KB
hibernate学习笔记.docx
《hibernate学习笔记.docx》由会员分享,可在线阅读,更多相关《hibernate学习笔记.docx(31页珍藏版)》请在冰豆网上搜索。
hibernate学习笔记
Domainobject限制:
1.Domain对象必须有一个不带参数的构造方法(必须的)
因为hibernate创建对象的时候是调用的Newinstance方法,这个方法必须有不带参数的构造方法。
2.有无意义的标识符id(主键)(可选)
3.非final的,对懒加载有影响(可选)
配置实体表时,如果和数据库冲突,表名可以另起或者加上`User`反引号(1左边那个键)
注意:
如果表已经创建,再去配置表的属性,不会对表属性有影响,所以一开始就要把表的
约束性条件,字段设置好。
1.domain.hbm.xml的配置
package=".hibernate.domain">//domain对象所处的包
2.session的主要方法
1.save,persist保存数据,persist在事务外不会产生insert语句
2.delete删除对象
3.update,更新对象,如果数据库中没有记录,会出现异常
4.get,根据id查,会立刻访问数据库
5.load,根据id查(返回的是代理,不会立即访问数据库)懒加载
6.SaveOrUpdate,merge(根据id和version的值来确定是save或update)调用merge你的对象还是脱管的
7.lock(把对象变成持久对象,但不会同步对象的状态)
3.实体对象的三种状态
1.Transient(瞬时的)
数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来
且与session没有关联的对象
2.Persistent(持久的)
数据库中有数据与之对象,当前与session有关联,并且相关联的session没有关闭,事
务没有提交;持久对象状态发生变化,在事务提交时,会影响到数据库(hibernate能检测到)
3.Detached(脱管的)
数据库中有数据与之对应,但当前没有session与之关联,托管对象状态发生改变,hibernate
不能检测到。
4.实现复杂的查询
HQL(HibernateQueryLanguage)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和
属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要
通过Query来操作,Query的创建方式:
Queryq=session.createQuery(hql);
●fromPerson
●fromUseruserwhereuser.name=:
name
●fromUseruserwhereuser.name=:
nameanduser.birthday<:
birthday
Criteria
Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:
Criteriacrit=session.createCriteria(DomainClass.class);
简单属性条件如:
criteria.add(Restrictions.eq(propertyName,value)),
criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))
staticvoidquery(Stringname){
Sessionsession=null;
try{
session=HibernateUtil.getSession();
//Stringhql="fromUserasuserwhereuser.name=?
";
//Queryque=session.createQuery(hql);
//que.setString(0,name);
/**
*运用别名的方式设置参数
*/
Stringhql="fromUserasuserwhereuser.name=:
n";
Queryque=session.createQuery(hql);
que.setString("n",name);
que.setFirstResult(0);//实现分页查询设置起始记录的位置
que.setMaxResults
(2);//设置最多的记录数
List
for(Useru:
user)
System.out.println(u.getBirthday());
//Userus=(User)que.uniqueResult();//当查询的结果只有一个对象的时候可以用这个方法。
。
。
。
//System.out.println(us.getBirthday());
}catch(HibernateExceptione){
e.printStackTrace();
throwe;
}finally{
if(session!
=null)
session.close();
}
}
/**
*使用criteria接口来查询
*所拥有的方法和HQL基本相同
*@paramname
*/
staticvoidcriteria(Stringname){
Sessions=null;
try{
s=HibernateUtil.getSession();
Criteriaca=s.createCriteria(User.class);
ca.add(Restrictions.eq("name",name));
ca.add(Restrictions.le("birthday",newDate()));
List
for(Useru:
user)
System.out.println(u.getBirthday());
}catch(HibernateExceptione){
throwe;
}
}
5.实体对象关联关系
注意:
多对一和一对多的关系都必须对其进行初始化不然将得到的是空值,因为用到了懒加载
初始化过程:
Hibernate.initialize(emp.getDepart());//对多对一关系进行初始化
Hibernate.initialize(depart.getEmp());//对一对多关系进行初始化
注意:
1.多对一的关系映射
Employee----Department的关系映射
多个员工有可能对应的是一个部门
Employee实体类
publicclassEmployee{
privateintid;
privateStringname;
privateDepartmentdepart;
publicEmployee(){}
Employee实体映射文件的配置
package=".hibernate.domain"> //多对一的配置name是实体类中的属性名,column是外键的列名
在类中的使用
/**
*增加一个部门和一个该部门的员工。
。
。
*@return
*/
staticEmployeeadd(){
Sessions=null;
Transactiontx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
Departmentdepart=newDepartment();
depart.setName("newdepatr1");
Employeeemp=newEmployee();
emp.setDepart(depart);
emp.setName("newEmployee1");
s.save(depart);
//如果先保存员工,再保存部门,那么depart_id就会是默认空值,
然后hibernate会执行一条更新语句,将id加上去
s.save(emp);/
/如果depart_id设置了not-null,那么这两个的顺序就不能换,不然就会报错。
mit();
returnemp;
}catch(HibernateExceptione){
if(tx!
=null)
tx.rollback();
throwe;
}finally{
if(s!
=null)
s.close();
}
}
/**
*根据员工id查询员工信息
*@paramid
*@return
*/
staticEmployeegetEmp(intid){
Sessions=null;
try{
s=HibernateUtil.getSession();
Employeeemp=(Employee)s.get(Employee.class,id);
Hibernate.initialize(emp.getDepart());//此处是懒加载,必须初始化一下
returnemp;
}catch(HibernateExceptione){
throwe;
}finally{
if(s!
=null)
s.close();
}
}
2.一对多的关系映射
Department---Employee的关系映射
一个部门有多个员工
Department实体类
publicclassDepartment{
privateintid;
privateStringname;
privateSet
publicDepartment(){}
Department实体映射文件的配置
package=".hibernate.domain">
在类中的使用
/**
*根据id获取部门
*@paramid
*@return
*/
staticDepartmentgetDepart(intid){
Sessions=null;
try{
s=HibernateUtil.getSession();
//获取实体对象
Departmentdepart=(Department)s.get(Department.class,id);
Hibernate.initialize(depart.getEmp());//此处懒加载,对set集合进行初始化
returndepart;
}catch(HibernateExceptione){
throwe;
}finally{
if(s!
=null)
s.close();
}
}
3.一对一的关系映射
Person---IdCard的关系映射
一个人只有一个身份证
Person实体类
publicclassPerson{
privateintid;
privateStringname;
privateIdCardidCard;
publicPerson(){}
IdCard实体类
publicclassIdCard{
privateintid;
privateDateusefulDate;
privatePersonperson;
publicIdCard(){}
实体映射文件的配置
Person实体
package=".hibernate.domain">
Idcard实体
package=".hibernate.domain">
在类中的使用
/**
*增加一个人及其他的身份证
*
*一对一的关系映射
*@return
*/
staticPersonaddOneToOne(){
Sessions=null;
Transactiontx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
IdCardidCard=newIdCard();
idCard.setUsefulDate(newDate());
Personperson=newPerson();
person.setName("p2");
person.setIdCard(idCard);
idCard.setPerson(person);
s.save(person);
s.save(idCard);
mit();
returnperson;
}catch(HibernateExceptione){
if(tx!
=null)
tx.rollback();
throwe;
}finally{
if(s!
=null)
s.close();
}
}
4.多对多的关系映射
Student-----Teacher的关系映射
一个学生可以有多个老师教,一个老师也可以教多个学生
Student实体类
publicclassStudent{
privateintid;
privateStringname;
privateSet
publicStudent(){}
Teacher实体类
publicclassTeacher{
privateintid;
privateStringname;
privateSet
publicTeacher(){}
实体映射文件的配置
Student实体
Teacher实体
在类中的使用
/**
*增加两个老师和两个学生
*一个学生两个老师教
*一个老师教两个学生
*@return老师
*/
staticTeacheraddTeacher(){
Sessions=null;
Transactiontx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
Set
Set
Teachert1=newTeacher();
t1.setName("t1");
st.add(t1);
Teachert2=newTeacher();
t2.setName("t2");
st.add(t2);
Students1=newStudent();
s1.setName("s1");
ss.add(s1);
Students2=newStudent();
s2.setName("s2");
ss.add(s2);
s.save(s1);
s.save(s2);
s.save(t1);
s.save(t2);
t1.setStudents(ss);
t2.setStudents(ss);
//s2.setTeachers(st);
mit();
returnt1;
}catch(HibernateExceptione){
if(tx!
=null)
tx.rollback();
throwe;
}finally{
if(s!
=null)
s.close();
}
}
/**
*根据id查询得到一个学生
*并返回了教这个学生的老师
*@paramid
*@return学生
*/
staticStudentgetStudent(intid){
Sessions=null;
try{
s=HibernateUtil.getSession();
Studentst=(Student)s.get(Student.class,id);
Hibernate.initialize(st.getTeachers());
returnst;
}catch(HibernateExceptione){
throwe;
}finally{
if(s!
=null)
s.close();
}
}
注意:
如果需要将两个实体放入一个表,那么就用组件关系映射否则就用一对一或者多对一的关系映射
5.组件关联关系映射
User----Name的关系映射
这种关系适应于两个对象放入一个表中的情况
一个用户的名字,可以由两部分组成,需要放入一个表中
User实体类
publicclassUser{
privateintid;
privateNamename;
privateDatebirthday;
publicUser(){}
Name实体类
publicclassName{
privateStringfirstName;
privateStringlastName;
publicName(){}
实体映射文件的配置
User实体
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 学习 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)