补充:
在hibernate.cfg.xml中引入类
<mapping class="com.hibernate.User"/>
在hibernate.cfg.xml中引入xml文件
<mapping resource="com/hibernate/User.hbm.xml"/>
annotation和xml只需一种方式,所以根据使用引入其中一种即可
1.设定cascade可以设定在持久化时对于关联对象的操作
2.cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大
a.cascade的属性指明做什么操作的时候关联对象是绑定在一起的
b.merge = save + update
c.refresh = A里面需要读B改过之后的数据
3.双向铁律:双向关系在程序中要设定双向关联(重要)
4.双向铁律:双向mappedBy
5.fetch
(1)铁律:双向不要两边设置eager(会有多余的查询语句发出)
(2)对多方设置fetch的时候要谨慎,结合具体应用,一般用lazy不用eager,
特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)
6.O/R Mapping编程模型
(1)映射模型(数据库表结构)
a.jpa annotation(现在使用)
b.hibernate annnotation extension
c.hibernate xml
d.jpa xml
(2)编程接口(具体增删改查)
a.jpa
b.hibernate(现在使用)
(3)数据查询语言
a.HQL
b.EJBQL(JPQL) //是HQL的子集
7.要想删除或者更新,先做load,除了精确知道id之外
8.如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删记录,
该记录就变成垃圾数据
9.如果指定@OneToOne的属性fetch为lazy,会延迟对于关联对象的加载,
不管是load还是get
a.C--create
public class User
{
private int id;
private String name;
@ManyToOne(cascade={CascadeType.ALL})
private Group group;
}//加上cascade后可以省去s.save(g)这一步
public void testSaveUser(){
User u =new User();
u.setName("u1");
Group g = new Group();
g.setName("g1");
u.setGroup(g);//建立两者之间的关联
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
s.save(g);//默认情况下不会自动保存关联变量
//解决办法:可以手动,也可以用cascade
s.save(u);
s.getTransaction().commit();
}
(1)删去s.save(u);而采用g.getUsers.add(u1);
如果没有设置双向关联,则user的Group属性为空
(2)双向关系在程序中要设定双向关联
b.R--retrieve
public void testGetUser(){
testSaveUser();
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.get(User.class,1);
//此时默认group也会被取出来
s.getTransaction().commit();
}
(1)即取多方的时候一方会被取出,但是取一方的时候多方默认不会被取出
(2)cascade影响的是CUD,读取的时候没有影响
(3)fetch影响的是R,即load或get等其他方式的读取
@OneToMany 最好设置fetch=FetchType.Lazy,默认是lazy
@ManyToOne 默认是eager
(4)@ManyToOne 用load方法取值,eager先取关联,
lazy先取user
(5)双向关联不要两边同时设置eager
c.U--update
public void testUpdateUser(){
testSaveUser();
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.get(User.class,1);
s.getTransaction().commit();
u.setName("user");
u.getGroup().setName("group");
Session s2 = sessionFactory.getCurrentSession();
s2.beginTransaction();
s2.update(u);//只有cascade是all的时候才会都更新
s2.getTransaction().commit();
}
(1)cascadeType是merge,只有merge操作才会级联;
同理persist的cascade在persist操作下级联
d.D--delete
public void testDeleteUser(){
testSaveUser();
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.load(User.class,1);
//s.delete(u);
//此时删除u1,再删除g1,再删除g1关联的所有user
//若不设置cascade,解决办法(两者使用其一即可):
//一是先解除关联关系
//u.setGroup(null);
//s.delete(u);
//二是使用hql
s.createQuery("delete from User u where u.id = 1").executeUpdate();
s.getTransaction().commit();
}
13hibernate hibernate关联关系的CRUD(增删改查)
最新推荐文章于 2020-12-22 11:50:28 发布
