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
@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;
}
}
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
@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;
}
}
测试类代码:
public class Hibernate_ORMappingTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass(){
new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);
sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}
@Test
public 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();
}
@Test
public 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();
}
@Test
public void getUser(){
this.saveUser();
Session s=sessionFactory.getCurrentSession();
s.beginTransaction();
User user=(User)s.get(User.class, 1);
}
@Test
public void getGroup(){
this.saveGroup();
Session s=sessionFactory.getCurrentSession();
s.beginTransaction();
Group g=(Group)s.get(Group.class, 1);
}
@Test
public 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();
}
@Test
public 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语句