首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate-关系照射CRUD

2012-08-24 
hibernate--关系映射CRUDCRUD中主要学习了1.cascade(CascadeType.*)2.fetchFetchType.*这两者都是级联操

hibernate--关系映射CRUD

CRUD中主要学习了

1.cascade=(CascadeType.*)
2.fetch=FetchType.*

这两者都是级联操作,就是删除一方时,另一方也相应删除。

前者主要是用于增删查找,常用于save(),update(),delete()等,后者主要是get(),load()操作.

一.Cascade

CascadeType有四种类型ALL,PERSIST,REFRESH,MERGE

CascadeType.ALL最常用的,只要不是读取,都能这么写

1.save(),persist()

save()或者是persist()//由于hibernate要与其他工具相关联,所以用save必须设定为CascadeType.ALL,persist还可以是CascadeType.PERSIST

@Test
public void testSaveGroup(){?
?User u1 =new User();
?u1.setName("u1");
?User u2 =new User();
?u2.setName("u2");
?Group g =new Group();
?g.setId(1);
?g.setName("g1");
?g.getUsers().add(u1);//设定group和user的关系,即g对象到u1,1对多的关系
?g.getUsers().add(u2);
?u1.setGroup(g);//把g_id的值写入user中
?u2.setGroup(g);
?Session s = sf.getCurrentSession();
?s.beginTransaction();
?s.persist(g);??? //不用cascade的话,?s.persist(g);?????s.persist(u);??? 也可以
//?s.save(u);
?s.getTransaction().commit();
?}

2.update()或merge(),与之前类似,CascadeType.MERGE

常用的文档说明里面的update()应该是脱机态,到持久态。

@Test
public void testUpdate2User(){?
?testSaveGroup();
?
?Session s = sf.getCurrentSession();
?s.beginTransaction();
?User u = (User)s.get(User.class, 1);
?s.getTransaction().commit();
?u.getGroup().setName("aaaa");??//这里其实是给Group 中的group.name设置值,所以结果自然在表中
?u.setName("qqqq");
?
?Session s1 = sf.getCurrentSession();
?s1.beginTransaction();
?s1.update(u);
?s1.getTransaction().commit();
}

另一种

@Test
public void testUpdate1User(){?
?testSaveGroup();
?
?Session s = sf.getCurrentSession();
?s.beginTransaction();
?User u = (User)s.get(User.class, 1);
?
?u.getGroup().setName("qwe");??
?u.setName("asd");
?
?s.getTransaction().commit();
}

3.delete()

直接级联删除很容易,但是,只是部分删除,比较复杂,常用hql语句来写


?for(User u : g.getUsers())//是因为g.getUsers是数组,必须这么写,相当于遍历了与g这个实例下的相关user表中的ID

{
?u.setGroup(null);?? //给user中的g_id设为 null值,group中不能设为CascadeType.ALL


?}
?s.delete(g);

?s.getTransaction().commit();
}

两者等价,后者用到HQL语句

?for(User u : g.getUsers()){
?s.createQuery("update User u set u.group=null where u.group="+g.getId()).executeUpdate();
?}
?s.createQuery("delete from Group g where g.id="+g.getId()).executeUpdate();?from的是类和对象,这点关键
s.getTransaction().commit();


g.getUsers().setName()? //给User类中的某个对象设置值

二.FetchType有两种类型

lazy,eager

其作用主要是,级联取东西

many-to-one默认是eager//就是马上取

one-to-many默认是lazy//不取,除非是用到了才弄

一般不同时设eager,用默认,或者是两个都是lazy

get()和load的区别如前所述

@Test
public void testLoadGroup(){?
?testSaveGroup();
?
?Session s = sf.getCurrentSession();
?s.beginTransaction();
?Group g= (Group)s.load(Group.class, 1);

?for (User u : g.getUsers()) {??
??System.out.println(u.getName());
?}
?s.getTransaction().commit();?
}

热点排行