Hibernate_关联关系的CR_Cascade_Fetch
来源:互联网 发布:2016网络大电影大学 编辑:程序博客网 时间:2024/06/05 17:57
Fetch管:R(查) ; Cascade管:CUD(增删改)
假设要更新用户的同时级联更新group。可用@ManyToOne(cascade=CascadeType.ALL),其中CascadeType有4个属性,可查J2EE的API
具体代码如下,例子中是多对多双向关联
User类代码:
@Entity@Table(name="t_user")public class User {private int id;private String name;private Group group;@ManyToOne(cascade=CascadeType.ALL)public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}@Id@GeneratedValuepublic 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;}}
Group类代码:
@Entity@Table(name="t_group")public class Group {private int id;private String name;private Set<User> users=new HashSet<User>();@OneToMany(mappedBy="group",cascade=CascadeType.ALL,fetch=FetchType.EAGER)public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}@Id@GeneratedValuepublic 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;}}
测试类代码:
public class Hibernate_ORMappingTest {private static SessionFactory sessionFactory;@BeforeClasspublic static void beforeClass(){new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();}@AfterClasspublic static void afterClass() {sessionFactory.close();}@Testpublic void saveUser(){User u=new User();u.setName("jm");Group g=new Group();g.setName("g1");u.setGroup(g);Session s=sessionFactory.getCurrentSession();s.beginTransaction();//s.save(g);s.save(u);s.getTransaction().commit();}@Testpublic void saveGroup(){User u1=new User();u1.setName("u1");User u2=new User();u2.setName("u2");Group g=new Group();g.setName("g1");g.getUsers().add(u1);g.getUsers().add(u2);u1.setGroup(g);u2.setGroup(g);Session s=sessionFactory.getCurrentSession();s.beginTransaction();s.save(g);s.getTransaction().commit();}@Testpublic void getUser(){this.saveUser();Session s=sessionFactory.getCurrentSession();s.beginTransaction();User user=(User)s.get(User.class, 1);}@Testpublic void getGroup(){this.saveGroup();Session s=sessionFactory.getCurrentSession();s.beginTransaction();Group g=(Group)s.get(Group.class, 1);}@Testpublic void updateUser(){this.saveUser();Session s=sessionFactory.getCurrentSession();s.beginTransaction();User u=(User)s.get(User.class, 1);u.setName("jimmy");u.getGroup().setName("gggg1");s.update(u);s.getTransaction().commit();}@Testpublic void delUser(){this.saveGroup();Session s=sessionFactory.getCurrentSession();s.beginTransaction();User u=(User)s.load(User.class, 2);u.setGroup(null);s.delete(u);s.getTransaction().commit();}}
测试代码中saveUser()方法不用先保存g对象。保存u对象的时候会级联先保存g对象。
测试代码中saveUser()与saveGroup()的区别:saveGroup()方法在双方都必须设置对方的关联关系(当在保存组的时候,必须知道要保存哪些用户。而在保存用户的时候也必须要知道该用户是属于哪一个组)。而saveUser()方法只需要在user对象设置group对象的关系即可(因为User这方有所属的组这个属性,因此只需要在保存用户的时候关联所属的组即可)。
测试代码中getUser()方法:取User的时候默认会将关联的Group对象取出;若设置为lazy则不会取出group对象,只有当用到group对象的时候才会取出;
测试代码中getGroup()方法:取Group的时候默认不会将关联的User对象取出,若要取出则通过fetch=FetchType.EAGER来实现。默认是lazy
测试代码中delUser()方法:删除用户的时候,由于设置了级联关系,也会把group删除。若不想删除,则可以 1)设置cascade值;2)将级联关系中断(u.setGroup(null)代码即实现了中断关系);3)用HQL语句
- Hibernate_关联关系的CR_Cascade_Fetch
- 15. Hibernate_基于主键映射的1-1关联关系
- hibernate_级联操作、关联关系映射
- hibernate_多对多关联关系配置
- Hibernate_常用的关联模式
- Hibernate_映射_关联关系_cascade属性、单向关联
- 14. Hibernate_基于外键映射的1-1关联关系
- Hibernate_映射_关联关系_一对一映射2_基于外键的方式
- Hibernate_映射_关联关系_一对一映射3_基于主键的方式
- 16. Hibernate_映射多对多关联关系
- Hibernate_集合映射、关联关系、Session方法总结
- hibernate_商城关系表的建立
- Hibernate_组件关联
- Hibernate_映射继承关系
- Hibernate_映射_关联关系_一对多多对一映射1
- Hibernate_映射_关联关系_一对多多对一映射2、inverse属性
- Hibernate_映射_关联关系_多对多映射1
- Hibernate_映射_关联关系_多对多映射2
- JAVA技术支持课--第六次java语言技术支持--任务2--用冒泡排序法和朴素排序法,从大到小排列整数
- 光线追踪(RayTracing)算法理论与实践(二)平面、材质、联合光线与物体求交
- c++中的explicit关键字
- C/C++开发语言系列之19---C++类成员函数指针
- hdu 1426 Sudoku Killer
- Hibernate_关联关系的CR_Cascade_Fetch
- C/C++开发语言系列之20---C++类成员函数指针2
- c++模版的一点补充
- Oracle EBS R12 - 在Oracle Linux64 5.7上安装R12.1.1碰到的两个问题与解决方法
- NSDateFormatter NSDate NSCalendar NSdateComponents
- UIView 圆角化/全屏/边框和颜色
- Eclipse常用的高效插件
- linux下QT Qtopia 主机编译调试环境的建立过程
- Android:Side bar menu 实现收集