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语句

 

原创粉丝点击