1设定cascade以设定在持久化时对于关联对象的操作(CUD,R归Fetch管)
2cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大
a) Cascade的属性是数组格式,指明做什么操作的时候关联对象是绑在一起的
b) refresh = A里面需要读B改过之后的数据
cascade={CascadeType.ALL}
CascadeType取值
ALL Cascade all operations所有情况
MERGE Cascade merge operation合并(merge=save+update)
PERSIST Cascade persist operation存储 persist()
REFRESH Cascade refresh operation刷新
REMOVE Cascade remove operation删除
3铁律:双向关系在程序中要设定双向关联
4铁律:双向mappedBy
5fetch
a) 铁律:双向不要两边设置Eager(会有多余的査询语句发出)
b) 对多方设置fetch的时候要谨慎,结合具体应用,一般用Lazy不用eager,特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)
其中两个类分别为Group和User
User类:
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
private int id;
private String name;
private Group group;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.ALL})
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
Group类:
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_group")
public class Group {
private int id ;
private String name;
private Set<User> users = new HashSet<User>();
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(mappedBy="group")
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
@OneToMany(mappedBy="group",
cascade={CascadeType.ALL}, //控制增删改(即CUD)
fetch=FetchType.EAGER//控制查询(即R) EAGER值代表取出关联
LAZY值为不取关联
//多的一方fetch取值默认为LAZY
一的一方默认为EAGER
)
另外:如果User类(即多的一方)中设置fetch=FetchType.LAZY 则在调用多(即Group)的对象值的时候
类似延迟加载 即需要在commit();之前 session还存在时调用如:
System.out.println(user.getGroup().getName());
session.getTransaction().commit();
6Update时@ManyToOne()中的cascade参数关系
session.beginTransaction();
User user = (User)session.load(User.class,1);
//user对象属性改变事务commit时自动判断与数据库原有数据不同可自动update
//此时的update与@ManyToOne()中的cascade或fetch参数取值无关
user.setName("user1");
user.getGroup().setName("group1");
session.getTransaction().commit();
如果user改变在commit()之后且想要执行Update方法时
user与group表同时更新则,则User类的cascade={CascadeType.ALL},并在程序中写如下代码:
session.beginTransaction();
User user = (User)session.get(User.class,1);
session.getTransaction().commit();
user.setName("user1");
user.getGroup().setName("group1");
Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(user);
session2.getTransaction().commit();
7Delete时@ManyToOne()中的cascade关系
如果User及Group类中均设为@ManyToOne(cascade={CascadeType.All}),那么在执行如下:
session.beginTransaction();
User user = (User)session.load(User.class,1);
session.delete(user);
session.getTransaction().commit();
注意:此处删除的是多对一(即User对Group)
中的“多”的一方(User类)
会删除user及user对应的group,再反向对应group的user都会删除,原因就是设置了@ManyToOne(cascade={CascadeType.All})
三种方法可避免全部删除的情况:
1. 去掉@ManyToOne(cascade={CascadeType.All})设置;
2. 直接写Hql语句执行删除;
3. 将user对象的group属性设为null,相当于打断User与Group间的关联,代码如下
session.beginTransaction();
User user =(User)session.load(User.class,1);
user.setGroup(null);
session.delete(user);
session.getTransaction().commit();
注意:如果删除的是多对一中的“一”的一方(Group类)时,如果使用第3种方式(user属性设为null)来打断两个对象间的关联的话,代码与之前不同,如下:
session.beginTransaction();
Group group = (Group)session.load(Group.class,1);
//循环将group中的set集合下的各个user对象设为null
//相当于先将数据库中user表中与group表关联的字段(即groupid)设为null
for(User user :group.getUsers()){
System.out.println(user.getName());
user.setGroup(null);
}
//再将group的set集合设为null,相当于将group表中与user表关联的字段(即userid)设为null
//此句的前提是user表中的关联字段(groupid)已经为null,如没有则相当于破坏了一对多关联,会报错
group.setUsers(null);
session.delete(group);
session.getTransaction().commit();
分享到:
相关推荐
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
NULL 博文链接:https://cdxs2.iteye.com/blog/1934707
原创)OrnLite数据库缓存的介绍以及使用、一对多三级关联表及其CRUD怎删查改等操作demo;关联博客http://blog.csdn.net/lnn368/article/details/51358326
在Struts 2中实现CRUD.pdf
CRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rarCRUD.rar
struts的crud sample demo(struts-crud.war) 可以直接解压查看代码,或者放到工程中运行
关联API 这只是一个简单的CRUD API系统,其中jQuery重新加载了Table and Chart。 表单中的字段为:名字,姓氏和参与,后者的插入限制最高为100%,因此我们的API进行了验证,可以阻止100%以上的插入。 所有字段都...
SQLite CRUD
django-crudbuilder, 在 Django 中,通用CRUD实现 crudbuilder在 Django 中使用 Django tables2列出对象的通用CRUD实现。文档https://django-crudbuilder.readthedocs.org/en/la
android CRUD
(EmployeeType)有外键关联,并和字典表(DataDict)有字典关系 示例采用技术说明: 1、采用了WCF RIA Services来和服务器端传输数据,具体来说就是Silverlight项目 类型中的WCF RIA Services 类库项目,因为这个更...
mybatis中使用接口编程方式实现CRUD模板
CRUD项目核心框架
基于JPA的CRUD例子
ibatis mybatis crud 完整代码
easyUI的crud实现
javaweb简单的CRUD
ASP.NET中ACCESS数据库CRUD简单操作(规范示例)
的CRUD 进行改造,改代码还会持续重构,并不完善。 1.将create,show,delete,list都改成@Util方法,可以类似 public static void show(String id){ MyCRUD.show(id); } 的方式调用。更通用。 2.增加@...