Hibernate学习笔记

第一节:Hibernate配置:

1.HibernateCURD

2.Get()load()区别

第二节:HQL查询:

1.query.list();

2.query.iterate();

3.查询部分属性

使用对象数组

使用Map (键是下标)

使用Map (取别名)

通过所需要查询的字段,在实体中添加构造方法

通过hibernate提供的工具类

hql只能执行update,和deleteDML语句。不能执行insert语句

插入多个数据

执行分页语句

SQL预编译语句

原生SQL语句查询部分字段(转成Bean)

原生SQL语句查询部分字段(转成Map)

使用 Criteria 进行查询

第三节:多表操作

1.多表单向操作

多对一操作

一对多操作

一对一操作

多对多操作

 

2.多表双向操作

一对多操作

一对一操作

多对多操作

 

第四节:延迟加载策略

第五节:Hibernate中meger和update的区别

 

第一节Hibernate配置

Hibernate配置:

1.添加jar

2.修改HibernateUtil

private static ServiceRegistry serviceRegistry = null;

serviceRegistry = new ServiceRegistryBuilder().applySettings(

configuration.getProperties()).buildServiceRegistry();

sessionFactoryconfiguration.buildSessionFactory(serviceRegistry);

 

3.反向生成beanhbm.xml文件 注意:主键生成机制

4.测试CURD

Add()

Session session = HibernateUtil.getSession();

Transaction tx = null;

try {

tx = session.beginTransaction();

session.save(object);

tx.commit();

catch (Exception e) {

tx.rollback();

e.printStackTrace();

}finally{

HibernateUtil.closeSession();

}

Load()一条

Session session = HibernateUtil.getSession();

UserInfo userInfo = (UserInfo)session.load(UserInfo.class

new Long(65));

Load()全部

Session session = null;

String hql = "";

Query query = null;

try {

hql = " From UserInfo order by Userid asc";

//注意:

1.表名必须与对象名相同(区分大小写),字段名也要和对象名中的属性名相同(不区分大小写)。

2.在查询结果中不能带*,应该写成:hql = "select a From UserInfo a where userid>10 and userid<100 order by userid asc";

3.由于查询的结果是以对象的形式,所以不能以字段形式查询 (字段构不成对象)

session= HibernateUtil.getSession();

query = session.createQuery(hql);

List<UserInfo> userList = query.list();

for (UserInfo userInfo : userList) {

System.out.println(userInfo.getUserid()+"\t"+userInfo.getUsername()+"\t"+userInfo.getTruename());

}

catch (Exception e) {

e.printStackTrace();

}

第二节HQL

1.HQL查询:

1.query.list();(只会发出一条sql语句)

 

2.query.iterate();(先发一条语句去查询主键,将id缓存起来,然后根据id去数据库发出查询多条语句)

Iterator<UserInfo> iterator = query.iterate();

while(iterator.hasNext()){

UserInfo userInfo = iterator.next();

System.out.println(userInfo.getUserid()+"\t"

+userInfo.getUsername()+"\t"+userInfo.getTruename());

}

3.查询部分属性(字段)

1.使用对象数组

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select a.userid,a.username From UserInfo a order by userid asc";

session= HibernateUtil.getSession();

query = session.createQuery(hql);

List<Object[]> userList = query.list();

for (int i = 0; i < userList.size(); i++) {

Object[] objArray = userList.get(i);

String userid = String.valueOf(objArray[0]);

String username = String.valueOf(objArray[1]);

System.out.println(userid+"\t"+username);

}

catch (Exception e) {

e.printStackTrace();

}

2.使用Map (键是下标)

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select new map(a.userid,a.username) From UserInfo a order by userid asc";

session = HibernateUtil.getSession();

query = session.createQuery(hql);

List<Map<String,Object>> userList = query.list();

for (int i = 0; i < userList.size(); i++) {

//Object[] objArray = userList.get(i);

Map<String,Object> rowMap = 

(Map<String,Object>)userList.get(i);

String userid = String.valueOf(rowMap.get("0"));

String username = String.valueOf(rowMap.get("1"));

System.out.println(userid + "\t" + username);

}

catch (Exception e) {

e.printStackTrace();

}

3.使用Map (取别名)

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select new map(a.userid as userid,a.username as username) From UserInfo a order by userid asc";

session = HibernateUtil.getSession();

query = session.createQuery(hql);

List<Map<String,Object>> userList = query.list();

for (int i = 0; i < userList.size(); i++) {

//Object[] objArray = userList.get(i);

Map<String,Object> rowMap = 

(Map<String,Object>)userList.get(i);

String userid = String.valueOf(rowMap.get("userid"));

String username = 

String.valueOf(rowMap.get("username"));

System.out.println(userid + "\t" + username);

}

catch (Exception e) {

e.printStackTrace();

}

}

4.通过所需要查询的字段,在实体中添加构造方法

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select new com.bean.UserInfo(a.userid as userid

,a.username as username) From UserInfo a order by userid asc";

session = HibernateUtil.getSession();

query = session.createQuery(hql);

List<UserInfo> userList = query.list();

for (UserInfo userInfo : userList) {

System.out.println(userInfo.getUserid()+"\t"

+userInfo.getUsername());

}

catch (Exception e) {

e.printStackTrace();

}

5.通过hibernate提供的工具类org.hibernate.transform.Transformers

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select a.userid as userid,a.username as username From UserInfo a order by userid asc";//userid与对象的属性相同

session = HibernateUtil.getSession();

query = session.createQuery(hql);

query.setResultTransformer(Transformers.aliasToBean(

UserInfo.class));

List<UserInfo> userList = query.list();

for (UserInfo userInfo : userList) {

System.out.println(userInfo.getUserid()+"\t"+

userInfo.getUsername());

}

catch (Exception e) {

e.printStackTrace();

}

 

6.hql只能执行update,和deleteDML语句。不能执行insert语句

Session session = null;

String hql = "";

Query query = null;

Transaction tx = null;

try {

hql = "Update UserInfo set truename='更新' where userid=445 ";

hql = "Delete From UserInfo  where userid=445 ";

session = HibernateUtil.getSession();

tx = session.beginTransaction();

query = session.createQuery(hql);

query.executeUpdate();

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

}finally{

HibernateUtil.closeSession();

}

7.插入多个数据

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

for (int i = 0; i < 1000; i++) {

DeptBean deptBean = new DeptBean();

deptBean.setDeptId(String.valueOf(i));

deptBean.setDeptName("部门_"+i);

session.save(deptBean);

if(i%500==0){//清空缓存

session.clear();

session.flush();

}

}

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

}finally{

HibernateUtil.closeSession();

}

8.返回聚合结果(一个对象)

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select a From UserInfo a where userid=5";

session = HibernateUtil.getSession();

query = session.createQuery(hql);

//方法1

List<UserInfo> userList = query.list();

if(userList.size()>=1){

UserInfo userInfo = userList.get(0);

System.out.println(userInfo.getUsername());

}

//方法2

UserInfo userInfo = (UserInfo)query.uniqueResult();

if(userList.size()>=1){

userInfo = userList.get(0);

System.out.println(userInfo.getUsername());

}

hql = "select count(userid) From UserInfo a";//通过聚合语句查询

session = HibernateUtil.getSession();

query = session.createQuery(hql);

Long countRow = (Long)query.uniqueResult();

System.out.println(countRow);

catch (Exception e) {

e.printStackTrace();

}

 

9.执行分页语句

Session session = null;

String hql = "";

Query query = null;

try {

hql = "select a From UserInfo a order by userid asc";

session = HibernateUtil.getSession();

query = session.createQuery(hql);

query.setFirstResult(0);//页号pageNo,从0开始

query.setMaxResults(5);//每页的条数pageNum

List<UserInfo> userList = query.list();

for (UserInfo userInfo : userList) {

System.out.println(userInfo.getUserid() + "\t"

+ userInfo.getUsername() + "\t"

+ userInfo.getTruename());

}

catch (Exception e) {

e.printStackTrace();

}

4.预编译语言

Session session = null;

String hql = "";

Query query = null;

try {

//hql = "select a From UserInfo a where a.username like ? and a.usersex=? order by userid asc";

hql = "select a From UserInfo a where a.username like :username and a.usersex=:usersex order by userid asc";

session = HibernateUtil.getSession();

query = session.createQuery(hql);

//1

query.setString("username""%a%");

query.setString("usersex""1");

//2

//Map<String,Object> paramMap = new HashMap<String, Object>();

//paramMap.put("username", "%a%");

//paramMap.put("usersex", "1");

//query.setProperties(paramMap);

//3

//UserInfo paramBean = new UserInfo();

//paramBean.setUsername("%a%");

//paramBean.setUsersex("1");

//query.setProperties(paramBean);

List<UserInfo> userList = query.list();

for (UserInfo userInfo : userList) {

System.out.println(userInfo.getUserid() + "\t"

+ userInfo.getUsername() + "\t"

+ userInfo.getTruename());

}

catch (Exception e) {

e.printStackTrace();

}

5.SQL预编译语句

1.转成Bean

Session session = null;

SQLQuery sqlQuery = null;

String sql = null;

try {

sql = "Select userid,username From T_Userinfo where username like '%a%' order by userid asc";

session = HibernateUtil.getSession();

sqlQuery = session.createSQLQuery(sql);

 

// addScalar,其它的数据可以不用调用addScalar方法,Oracle中字段名全部都是大写

sqlQuery.addScalar("userid", LongType.INSTANCE);

sqlQuery.addScalar("username", StringType.INSTANCE);

 

sqlQuery.setResultTransformer(Transformers

.aliasToBean(UserInfo.class));

 

// addEntity适合查询所有的记录。

// sqlQuery.addEntity(UserInfo.class);

List userList = sqlQuery.list();

 

for (int i = 0; i < userList.size(); i++) {

System.out.println(userList.get(i));

}

catch (Exception e) {

e.printStackTrace();

}

2.转成Map

Session session = null;

SQLQuery sqlQuery = null;

String sql = null;

try {

sql = "Select a.*,b.menu_id from T_Sys_Role a left outer join T_Sys_Role_Menu b on a.role_id = b.role_id where a.role_id = 1";

session = HibernateUtil.getSession();

sqlQuery = session.createSQLQuery(sql);

 

sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

 

// addEntity适合查询所有的记录。

// sqlQuery.addEntity(UserInfo.class);

List userList = sqlQuery.list();

 

for (int i = 0; i < userList.size(); i++) {

System.out.println(userList.get(i));

}

catch (Exception e) {

e.printStackTrace();

}

 

6.原生SQL语句查询部分字段(转成bean,不需要创建构造方法)将小写转成大写

Session session = null;

SQLQuery sqlQuery = null;

String sql = null;

try {

sql = "Select userid,username From T_Userinfo where username like '%a%' order by userid asc";

session = HibernateUtil.getSession();

sqlQuery = session.createSQLQuery(sql);

sqlQuery.addScalar("userid", LongType.INSTANCE);

sqlQuery.addScalar("username", StringType.INSTANCE);

sqlQuery.setResultTransformer(

Transformers.aliasToBean(UserInfo.class));

List userList = sqlQuery.list();

for (int i = 0; i < userList.size(); i++) {

UserInfo userInfo = (UserInfo)userList.get(i);

//只能输出Select中查询的字段

System.out.println(userInfo.getUsername()

+"\t"+userInfo.getUserid());

}

catch (Exception e) {

e.printStackTrace();

}

7.原生SQL语句查询部分字段(转成Map,不需要创建构造方法)将小写转成大写

Session session = null;

SQLQuery sqlQuery = null;

String sql = null;

try {

sql = "Select a.*,b.menu_id from T_Sys_Role a left outer join T_Sys_Role_Menu b on a.role_id = b.role_id where a.role_id = 1";

session = HibernateUtil.getSession();

sqlQuery = session.createSQLQuery(sql);

sqlQuery.addScalar("role_id", StringType.INSTANCE);

sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

List<Map<String, Object>> roleList = sqlQuery.list();

for (int i = 0; i < roleList.size(); i++) {

Map<String, Object> paramMap =

 (Map<String, Object>)roleList.get(i);

System.out.println(paramMap.get("role_id"));

}

catch (Exception e) {

e.printStackTrace();

}

 

8.使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装

Session session = null;

List<UserBean> userList = null;

try {

session = HibernateUtil.getSession();

Criteria criteria = session.createCriteria(UserBean.class);

// 加条件

criteria.add(Restrictions.eq("usersex""0"));

criteria.add(Restrictions.ilike("username""%a%"));

criteria.add(Restrictions.between("userage"new Long(20),

new Long(30)));

// 排序

criteria.addOrder(Order.asc("userid"));

userList = criteria.list();

 

//userList = session.createCriteria(UserBean.class)

//.add(Restrictions.like("username", "%a%")).add(

//Restrictions.or(Restrictions.eq("usersex", "0"),

//Restrictions.between("userage",

//new Long(20), new Long(30))))

//.addOrder(Order.asc("userid")).list();

for (UserBean userBean : userList) {

System.out.println(userBean.getUserid() + "\t"

+ userBean.getUsername() + "\t" + userBean.getUsersex()

"\t" + userBean.getUserage());

}

 

catch (Exception e) {

e.printStackTrace();

finally {

HibernateUtil.closeSession();

}

第三节 多表操作

一、单向操作

  1、多对一(多的一方(GroupUser)获取一的一方(Group))

GroupUser.hbm.xml

<!-- many_to_one时,必须删除关联字段属性的设置。  

<property name="groupId" type="java.lang.Long">

<column name="GROUP_ID" precision="22" scale="0" />

</property>

-->

<!-- group_idGroupUser中和外表关联的字段(外键) -->

 

<many-to-one name="groupBean" class="com.many_to_one.GroupBean" column="group_id"/>

① Add()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

GroupBean groupBean = new GroupBean();

groupBean.setGroupname("java_兴趣小组");

GroupUserBean userBean_1 = new GroupUserBean();

userBean_1.setUsername("aa");

userBean_1.setGroupBean(groupBean);

 

GroupUserBean userBean_2 = new GroupUserBean();

userBean_2.setUsername("bb");

userBean_2.setGroupBean(groupBean);

 

GroupUserBean userBean_3 = new GroupUserBean();

userBean_3.setUsername("cc");

userBean_3.setGroupBean(groupBean);

 

session.save(groupBean);

session.save(userBean_1);

session.save(userBean_2);

session.save(userBean_3);

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

② Load()/Get()

Session session = null;

try {

session = HibernateUtil.getSession();

GroupUserBean userBean = 

(GroupUserBean)session.get(GroupUserBean.classnew Long(64));

GroupBean groupBean = userBean.getGroupBean();

System.out.println("用户的信息:"

+userBean.getUserid()+"\t"+userBean.getUsername());

System.out.println("组的信息:

"+groupBean.getGroupid()+"\t"+groupBean.getGroupname());

catch (Exception e) {

e.printStackTrace();

finally {

HibernateUtil.closeSession();

}

③ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

GroupUserBean userBean = (GroupUserBean) session.get(

GroupUserBean.classnew Long(67));

// 多对1时,

// 删除More一方,并不会级联的去删除One的一方。

session.delete(userBean);

// 如果想要级联删除one的一方,请显示进行删除的操作。

GroupBean groupBean = userBean.getGroupBean();

session.delete(groupBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

2、一对多(一的一方(ClassesBean(Set))获取一的一方(StudentBean))

a) Set方法

<set name="studentSet" order-by="studentID desc">

<key column="classes_id"></key>

<one-to-many class="com.one_to_many.StudentBean" />

</set>

b) List方法

<list name="studentList">

<key column="classes_id"></key>

<index column="index_id"></index>//多出一个需要排序的字段名

<one-to-many class="com.one_to_many.StudentBean" />

</list>

① Add ()

a) 添加完班级和学生对象后再修改学生中班级编号的字段(多发出update语句)

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

ClassesBean classesBean = new ClassesBean();

classesBean.setClassesname("java1212班");

StudentBean studentBean_1 = new StudentBean();

studentBean_1.setStudentname("张三");

studentBean_1.setStudentage(new Long(20));

StudentBean studentBean_2 = new StudentBean();

studentBean_2.setStudentname("李四");

studentBean_2.setStudentage(new Long(30));

StudentBean studentBean_3 = new StudentBean();

studentBean_3.setStudentname("张三2");

studentBean_3.setStudentage(new Long(40));

Set<StudentBean> studentSet = classesBean.getStudentSet();

studentSet.add(studentBean_1);

studentSet.add(studentBean_2);

studentSet.add(studentBean_3);

session.save(classesBean);

session.save(studentBean_1);

session.save(studentBean_2);

session.save(studentBean_3);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

b) 添加完班级通过获取班级的id再添加学生。在学生对象中添加班级编号

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

ClassesBean classesBean = new ClassesBean();

classesBean.setClassesname("java1212班");

Long classes_id = (Long) session.save(classesBean);

StudentBean studentBean_1 = new StudentBean();

studentBean_1.setStudentname("张三");

studentBean_1.setStudentage(new Long(20));

studentBean_1.setClassesId(classes_id);

StudentBean studentBean_2 = new StudentBean();

studentBean_2.setStudentname("李四");

studentBean_2.setStudentage(new Long(30));

studentBean_2.setClassesId(classes_id);

StudentBean studentBean_3 = new StudentBean();

studentBean_3.setStudentname("张三2");

studentBean_3.setStudentage(new Long(40));

studentBean_3.setClassesId(classes_id);

session.save(studentBean_1);

session.save(studentBean_2);

session.save(studentBean_3);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

② load()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

ClassesBean classesBean = (ClassesBean) session.load(

ClassesBean.classnew Long(43));

System.out.println("==班级的信息===");

System.out.println(classesBean.getClassesid() + "\t"

+ classesBean.getClassesname());

System.out.println("==学生的信息==");

/**

 * 1:Set中的数据如何排序

 * 在配置文件中加入order-by="studentID desc"进行排序。studentID是字段名称 

  *2:如何在SET中查询符合条件的记录。

              * A:循环逐条判断

 * B:createFilter接口来过滤数据 

 * C:可以使用HQL语句来进行过滤

 */

// A

Set<StudentBean> studentSet = classesBean.getStudentSet();

for (StudentBean studentBean : studentSet) {

System.out.println(studentBean.getStudentid() + "\t"

+ studentBean.getStudentname() + "\t"

+ studentBean.getStudentage());

}

// B

Query query = session.createFilter(studentSet,

" where studentage>=21 and studentage<=25");

List<StudentBean> queryList = query.list();

for (StudentBean studentBean : queryList) {

System.out.println(studentBean.getStudentid() + "\t"

+ studentBean.getStudentname() + "\t"

+ studentBean.getStudentage());

}

// C

String hql = "Select a From StudentBean a where a.classesId = :classID and  studentage>=21 

and studentage<=25 order by studentid asc";

query = session.createQuery(hql);

query.setLong("classID", classesBean.getClassesid());

queryList = query.list();

for (StudentBean studentBean : queryList) {

System.out.println(studentBean.getStudentid() + "\t"

+ studentBean.getStudentname() + "\t"

+ studentBean.getStudentage());

}

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

③ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

ClassesBean classesBean = (ClassesBean) session.get(

ClassesBean.classnew Long(41));

// 删除One一方,并不会级联的去删除More的一方。只是把More的一方中关联的字段的值设为NULL值。

// 如果想要级联删除More的一方,请显示进行删除的操作。

// A:获取More的集合,然后循环逐条删除

// Set<StudentBean> studentSet = classesBean.getStudentSet();

// for (StudentBean studentBean : studentSet) {

// session.delete(studentBean);

// }

// B:使用HQL语句,一次性删除或者更新

String hql = "Delete From StudentBean where classesId = :classesID";

Query query = session.createQuery(hql);

query.setLong("classesID", classesBean.getClassesid());

query.executeUpdate();

session.delete(classesBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

3、一对一(CardBean获取UserBean)

CardBean.hbm.xml

 主键生成机制(参考UserBean中的主键)

<generator class="foreign">

             <param name="property">userBean</param>

    </generator>

<one-to-one name="userBean" class="com.one_to_one.UserBean">

① Add()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

UserBean userBean = new UserBean();

userBean.setUsername("张三");

userBean.setPassword("1234");

userBean.setTruename("zhangsan");

CardBean cardBean = new CardBean();

cardBean.setUserBean(userBean);

cardBean.setCardnum("35012199101024241");

cardBean.setCardtime(new Long(20140101));

cardBean.setPublish("闽侯");

session.save(userBean);

session.save(cardBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

}finally{

HibernateUtil.closeSession();

}

② Load()

Session session = null;

try {

session = HibernateUtil.getSession();

CardBean cardBean = (CardBean) session.get(CardBean.class,

new Long(84));

System.out.println(cardBean.getUserId() + "\t"

+ cardBean.getCardnum() + "\t"

+ cardBean.getUserBean().getUsername() + "\t"

+ cardBean.getUserBean().getUserid());

 

catch (Exception e) {

e.printStackTrace();

finally {

HibernateUtil.closeSession();

}

③ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

// one-to_one不会级联删除

CardBean cardBean = (CardBean) session.get(CardBean.class,

new Long(84));

session.delete(cardBean);

 

UserBean userBean = cardBean.getUserBean();

session.delete(userBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

4、多对多(RoleBean获取PowerBean)

RoleBean.hbm.xml(t_role_power中间表 role_id ,power_id中间表中关联字段)

<set name="powerSet" table="t_role_power">

         <key column="role_id"></key>

         <many-to-many class="com.many_to_many.PowerBean" 

column="power_id"></many-to-many>

</set>

① Add()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

RoleBean roleBean_1 = new RoleBean();

roleBean_1.setRoleName("管理员");

RoleBean roleBean_2 = new RoleBean();

roleBean_2.setRoleName("会员");

PowerBean powerBean = new PowerBean();

powerBean.setPowername("权限1");

PowerBean powerBean_2 = new PowerBean();

powerBean_2.setPowername("权限2");

PowerBean powerBean_3 = new PowerBean();

powerBean_3.setPowername("权限3");

PowerBean powerBean_4 = new PowerBean();

powerBean_4.setPowername("权限4");

PowerBean powerBean_5 = new PowerBean();

powerBean_5.setPowername("权限5");

PowerBean powerBean_6 = new PowerBean();

powerBean_6.setPowername("权限6");

Set<PowerBean> powerSet = roleBean_1.getPowerSet();

powerSet.add(powerBean);

powerSet.add(powerBean_3);

powerSet.add(powerBean_5);

powerSet = roleBean_2.getPowerSet();

powerSet.add(powerBean_2);

powerSet.add(powerBean_4);

powerSet.add(powerBean_6);

session.save(roleBean_1);

session.save(roleBean_2);

 

session.save(powerBean);

session.save(powerBean_2);

session.save(powerBean_3);

session.save(powerBean_4);

session.save(powerBean_5);

session.save(powerBean_6);

tx.commit();

② Load()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

RoleBean roleBean = (RoleBean) session.load(RoleBean.class,

new Long(56));

//1获取角色和权限数据

// System.out.println("==角色的信息===");

// System.out.println(roleBean.getRoleid() + "\t"

// + roleBean.getRolename());

//

// System.out.println("==拥有的权限信息==");

// Set<PowerBean> powerSet = roleBean.getPowerSet();

// for (PowerBean powerBean : powerSet) {

// System.out.println(powerBean.getPowerid() + "\t"

// + powerBean.getPowername() + "\t"

// + powerBean.getPowerhref());

// }

//根据过滤条件查询数据

// Query query = session.createFilter(powerSet,

// " where power_id>=22 and power_id<=28");

// List<PowerBean> queryList = query.list();

// for (PowerBean powerBean : queryList) {

// System.out.println(powerBean.getPowerid() + "\t"

// + powerBean.getPowername() + "\t"

// + powerBean.getPowerhref());

// }

//查询中间表。没有映射成实体对象,所以只能使用SQL语句查询,不能使用HQL语句。

 

String hql = "Select * From T_Role_Power where power_id>=22 and power_id<=28 and role_id = "

+ roleBean.getRoleid() + "";

SQLQuery sqlQuery = session.createSQLQuery(hql);

sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

List<Map<String, Object>> list_2 = sqlQuery.list();

for (int i = 0; i < list_2.size(); i++) {

Map<String, Object> paramMap = list_2.get(i);

System.out.println(paramMap.get("POWER_ID") + "\t"

+ paramMap.get("ROLE_ID"));

}

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

③ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

//删除roleBean和关联表中的数据,不会级联删除powerBean中数据

RoleBean roleBean = (RoleBean)session.get(

RoleBean.classnew Long(57));

session.delete(roleBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

二、双向操作

1. 一对多(ClassesBeanStudentBean)

多的一方:

<many-to-one name="classesBean"

class="com.one_to_many.ClassesBean"column="classes_id"/>

删除多余的字段(属性)

<property name="classesId" type="java.lang.Long">

<column name="CLASSES_ID" precision="8" scale="0" />

</property>

① Add()多的一方添加
Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

ClassesBean classesBean = new ClassesBean();

classesBean.setClassesname("java1212班");

 

session.save(classesBean);

StudentBean studentBean_1 = new StudentBean();

studentBean_1.setStudentname("张三");

studentBean_1.setStudentage(new Long(20));

// 让学生记住班级对象

studentBean_1.setClassesBean(classesBean);

StudentBean studentBean_2 = new StudentBean();

studentBean_2.setStudentname("李四");

studentBean_2.setStudentage(new Long(30));

studentBean_2.setClassesBean(classesBean);

 

StudentBean studentBean_3 = new StudentBean();

studentBean_3.setStudentname("张三2");

studentBean_3.setStudentage(new Long(40));

studentBean_3.setClassesBean(classesBean);

 

session.save(studentBean_1);

session.save(studentBean_2);

session.save(studentBean_3);

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

② Load()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

ClassesBean classesBean = (ClassesBean) session.load(

ClassesBean.classnew Long(42));

System.out.println("正向读取,班级----》学生");

System.out.println("==班级的信息===");

 

System.out.println(classesBean.getClassesid() + "\t"

+ classesBean.getClassesname());

 

System.out.println("==学生的信息==");

/**

 * 1:Set中的数据如何排序,

 * 

 * 在配置文件中加入order-by="studentID desc"进行排序。studentID是字段名称

 * 

 * 2:如何在SET中查询符合条件的记录。

 * 

 * A:循环逐条判断

 * 

 * B:createFilter接口来过滤数据

 * 

 * C:可以使用HQL语句来进行过滤

 */

Set<StudentBean> studentSet = classesBean.getStudentSet();

for (StudentBean studentBean : studentSet) {

System.out.println(studentBean.getStudentid() + "\t"

+ studentBean.getStudentname() + "\t"

+ studentBean.getStudentage());

}

 

System.out.println("===反向读取,学生----》班级");

 

StudentBean studentBean = (StudentBean) session.get(

StudentBean.classnew Long(46));

 

System.out.println(studentBean.getStudentid() + "\t"

+ studentBean.getStudentname() + "\t"

+ studentBean.getStudentage());

 

System.out.println("班级的信息");

 

classesBean = studentBean.getClassesBean();

 

System.out.println(classesBean.getClassesid() + "\t"

+ classesBean.getClassesname());

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

③ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

ClassesBean classesBean = (ClassesBean) session.get(

ClassesBean.classnew Long(41));

// 1对多

// 删除One一方,并不会级联的去删除More的一方。只是把More的一方中关联的字段的值设为NULL值。

 

// 如果想要级联删除More的一方,请显示进行删除的操作。

// A:获取More的集合,然后循环逐条删除

 

// Set<StudentBean> studentSet = classesBean.getStudentSet();

// for (StudentBean studentBean : studentSet) {

// session.delete(studentBean);

// }

 

// B:使用HQL语句,一次性删除或者更新

String hql = "Delete From StudentBean where

 classesId = :classesID";

Query query = session.createQuery(hql);

query.setLong("classesID", classesBean.getClassesid());

query.executeUpdate();

session.delete(classesBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

2. 多对多(RoleBean(角色)PowerBean(权限))

RoleBean.hbm.xml

<set name="powerSet" table="t_role_power">

<key column="role_id"></key>

<many-to-many class="com.many_to_many.PowerBean"

column="power_id">

</many-to-many>

</set>

RoleBean.hbm.xml

<set name="roleSet" table="t_role_power">

<key column="power_id"></key>

<many-to-many class="com.many_to_many.RoleBean"

column="role_id">

</many-to-many>

</set>

 

④ Add()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

RoleBean roleBean_1 = new RoleBean();

roleBean_1.setRoleName("超级用户");

 

RoleBean roleBean_2 = new RoleBean();

roleBean_2.setRoleName("普通用户");

 

PowerBean power_1 = new PowerBean("权限1""/xx.jsp");

PowerBean power_2 = new PowerBean("权限2""/aa.jsp");

PowerBean power_3 = new PowerBean("权限3""/bb.jsp");

PowerBean power_4 = new PowerBean("权限4""/cc.jsp");

PowerBean power_5 = new PowerBean("权限5""/dd.jsp");

PowerBean power_6 = new PowerBean("权限6""/ee.jsp");

 

Set<PowerBean> powerSet_1 = roleBean_1.getPowerSet();

Set<PowerBean> powerSet_2 = roleBean_2.getPowerSet();

 

powerSet_1.add(power_1);

powerSet_1.add(power_3);

powerSet_1.add(power_5);

 

powerSet_2.add(power_2);

powerSet_2.add(power_4);

powerSet_2.add(power_5);

powerSet_2.add(power_6);

 

session.save(roleBean_1);

session.save(roleBean_2);

session.save(power_1);

session.save(power_2);

session.save(power_3);

session.save(power_4);

session.save(power_5);

session.save(power_6);

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

⑤ Load()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

RoleBean roleBean = (RoleBean) session.load(RoleBean.class,

new Long(56));

 

System.out.println("角色---->权限");

 

System.out.println(roleBean.getRoleId() + "\t"

+ roleBean.getRoleName());

 

Set<PowerBean> powerSet = roleBean.getPowerSet();

for (PowerBean powerBean : powerSet) {

System.out.println(powerBean.getPowerid() + "\t"

+ powerBean.getPowername() + "\t"

+ powerBean.getPowerhref());

}

System.out.println("权限--->角色");

PowerBean powerBean = 

(PowerBean) session.get(PowerBean.class,

new Long(27));

System.out.println(powerBean.getPowerid() + "\t"

+ powerBean.getPowername() + "\t"

+ powerBean.getPowerhref());

 

Set<RoleBean> roleSet = powerBean.getRoleSet();

for (RoleBean roleBean2 : roleSet) {

System.out.println(roleBean2.getRoleId() + "\t"

+ roleBean2.getRoleName());

}

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

⑥ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

RoleBean roleBean = (RoleBean) session.load(RoleBean.class,

new Long(21));

// 只会删除角色与中间表的数据。权限表的信息不做删除。

session.delete(roleBean);

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

3. 一对一(CardBeanUserBean)

CardBean.hbm.xml(删除多余的关联字段)

 <one-to-one name="userBean" class="com.one_to_one.UserBean">

UserBean.hbm.xml

<one-to-one name="cardBean" 

class="com.one_to_one.CardBean"></one-to-one>

 

① add()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

UserBean userBean = new UserBean();

userBean.setUsername("One_to_One");

userBean.setPassword("1234");

userBean.setTruename("一对一的关联");

CardBean cardBean = new CardBean();

cardBean.setUserBean(userBean);

// 为了获取userBean中的主键的值。

cardBean.setCardnum("35017821945211");

cardBean.setCardtime(new Long(10));

cardBean.setPublish("福州市鼓楼区");

 

session.save(userBean);

session.save(cardBean);

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

② Load()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

CardBean cardBean = (CardBean) session.load(CardBean.class,

new Long(61));

 

System.out.println("==身份证的信息===");

 

System.out.println(cardBean.getCardnum() + "\t"

+ cardBean.getPublish());

 

System.out.println("==用户的信息==");

UserBean userBean = cardBean.getUserBean();

 

System.out.println(userBean.getUserid() + "\t"

+ userBean.getUsername() + "\t" 

+ userBean.getTruename());

 

System.out.println("双向信息读取用户----》身份证");

 

userBean = (UserBean) session.get(

UserBean.classnew Long(61));

 

System.out.println(userBean.getUserid() + "\t"

+ userBean.getUsername() + "\t" 

+ userBean.getTruename());

 

cardBean = userBean.getCardBean();

 

System.out.println(cardBean.getCardnum() + "\t"

+ cardBean.getPublish());

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

③ Delete()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

CardBean cardBean = (CardBean) session.load(CardBean.class,

new Long(63));

// one-to_one也不会级联删除

session.delete(cardBean);

 

UserBean userBean = cardBean.getUserBean();

session.delete(userBean);

 

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

 

 

第四节 延迟加载策略

1.实体对象延迟加载

① 单表(DeptBean)

DeptBean.hbm.xml

<class name="com.bean.DeptBean" table="T_SYS_DEPT" 

schema="TEST" lazy="true">

lazy="true" 表示进行对象的延迟加载,只对load()起作用

只取其中的ID时则不会发出SQL语句,只有查询其他属性时才根据id去数据库查询对应的数据

lazy="false" 表示进行对象的立即加载,get()/load()都不起作用

LoadGet区别:

a. 

Load方法是认为所查询的数据库中肯定存在该数据,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常

对于get方法,hibernate一定要获取到真实的数据,否则返回null

b. 

Load方法加载的对象时代理对象,Get方法加载的对象时实体对象

c.使用load方法时,必须要在session关闭之前就要将所有的数据出来,不然就会报“no session”异常。

 

2.集合对象的延迟加载

One_to_many

<set name="studentSet" order-by="studentname asc" lazy="true">

lazy="true"  表示进行对象的延迟加载

lazy="false" 表示进行对象的立即加载

lazy="extra" 表示进行对象的延迟加载。

如果需要查询集合的大小,则多发出一条语句查询,否则就与true的效果相同

注意点:

web层中调用查询集合中的大小的时候,需要将延迟加载关闭。

3.属性的延迟加载(大字段)

<property name="content" type="java.sql.Clob" lazy="true">

<column name="CONTENT" />

</property>

<property name="faceimage" type="java.sql.Blob" lazy="true">

<column name="FACEIMAGE" />

</property>

② Add()

Session session = null;

Transaction tx = null;

try {

session = HibernateUtil.getSession();

tx = session.beginTransaction();

 

LobHelper lobHelper = session.getLobHelper();

Clob clob = lobHelper.createClob("");

Writer writer = clob.setCharacterStream(0);

String file = "E:/TestLazy.java";

BufferedReader br = new BufferedReader(

new FileReader(new File(file)));

String entry = null;

while((entry = br.readLine())!=null){

writer.write(entry);

writer.write("\n");

}

writer.flush();

writer.close();//关闭流

Blob blob = lobHelper.createBlob(new byte[0]);

OutputStream os = blob.setBinaryStream(0);

InputStream is = new FileInputStream("d:/1.jpg");

int i = 0;

byte[] b = new byte[1024];

while((i=is.read(b))!=-1){

os.write(b,0,i);

}

LobBean lobBean = new LobBean();

lobBean.setContent(clob);

lobBean.setFaceimage(blob);

session.save(lobBean);

is.close();

os.close();

tx.commit();

catch (Exception e) {

e.printStackTrace();

tx.rollback();

finally {

HibernateUtil.closeSession();

}

③ load()

需要对类进行类增强机制

新建build.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="hibernatelazy" default="instrument" basedir=".">

      <property name="lib.dir" value="./lib"/>

      <property name="classes.dir" value="./classes"/>

 

      <path id="lib.class.path">

            <fileset dir="${lib.dir}">

                   <include name="**/*.jar"/>

             </fileset>

       </path>

       <target name="instrument">

           <taskdef name="instrument" 

classname="org.hibernate.tool.instrument.InstrumentTask">

                    <classpath path="${classes.dir}"/>

                    <classpath refid="lib.class.path"/>

            </taskdef>

            <instrument verbose="true">

                     <fileset dir="${classes.dir}/com/derek/known/hbm">

                           <include name="Knownquestions.class"/>

                     </fileset>

             </instrument>

        </target>

</project>

注意:
<property name="lib.dir" value="./lib"/>所需的JAR文件路径
<property name="classes.dir" value="./classes"/>编译输出路径

第五节:Hibernate中meger和update的区别

meger()先发起一条select语句查看数据库是否存在id

①.如果存在,则会去比较值是否改变,如果数据有改变则会发起一条update语句;如果数据不改变则不发起update语句;

②.如果不存在,则数据库发起一个insert语句;

③.update则没有先发起select语句,而是直接去update;

saveOrUpdate()做下面的事: 

  • 如果对象已经在本session中持久化了,不做任何事
  • 如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
  • 如果对象没有持久化标识(identifier)属性,对其调用save()
  • 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
  • 如果对象是附带版本信息的(通过<version>或<timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。
  • 否则update() 这个对象


merge()可非常不同: 

  • 如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
  • 如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例
  • 最后返回该持久实例
  • 用户给出的这个对象没有被关联到session上,它依旧是脱管的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值