Hibernate_关联关系的CR_Cascade_Fetch

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值