Hibernate的双向多对一

         为了实现双向多对一,说来也很简单。只需要将上一篇博客《Hibernate的单向多对一》中的代码修改两处即可:

          1,Room.hbm.xml中添加:

<set name="users" inverse="false" cascade="all">
			<key column="id" />
			<one-to-many class="com.wjy.models.User" />
</set>

 对以上参数进行一下说明:name:需要在Room.java中添加的成员变量(Set类型)的名字。

                                           key:room这张表的主键,即在数据库中的名称。

                                           class:set中的类型。

          2,Room.java中添加:

private Set<User> users=new HashSet<User>();
public Set getUsers() {
		return users;
	}

public void setUsers(Set users) {
		this.users = users;
	}

 

添加仅此两处即可。

下面我们测试一下看看会出现什么情况:

1,首先我们添加一个Room,并为其指定其中的住户,最后存储该Room后,会发现自动添加了该User的记录到数据库中。

public void addRoomGenerateUser(){
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		User user=new User();
		user.setName("YY");
		Room room=new Room();
		room.setAddress("Xian");
		room.getUsers().add(user);
		session.save(room);
		transaction.commit();
		session.close();
	}

 

 2,接下来我们添加一个User,并为其指定Room,最后存储User,会发现自动生成了Room的记录。

public void addUserGenerateUser(){
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		
		Room room=new Room();
		room.setAddress("Beijing");
		User user=new User();
		user.setName("ZhangYu");
		user.setRoom(room);
		
		session.save(user);
		transaction.commit();
		session.close();
	}

 

 3,接下来,我们再添加一个User,为其指定上一个相同的Room,在存储了该User之后,发现只添加了该User,那个Room已经存在无需再添加。

public void addAnotherUserWithSameRoom(){
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		
		Room room=(Room) session.load(Room.class, 19);//这里的19是数据库中这条记录的id
		
		User user=new User();
		user.setName("ZhaoManting");
		user.setRoom(room);
		
		session.save(user);
		transaction.commit();
		session.close();
	}

 

 4,接下来,我们获得room_id都为19的User们,并找到他们的Room:

 

public void getRoomBelongToUsers(){
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		
		String hql="FROM User WHERE room_id='19'";
		Query users=session.createQuery(hql);
		List list=users.list();
		Iterator iterator=list.iterator();
		
		while(iterator.hasNext()){
			User user=(User) iterator.next();
			System.out.println(user.getName()+"   in   "+user.getRoom().getAddress());
		}
		
		session.close();
	}
 运行结果:

 

 

ZhangYu   in   Beijing
ZhaoManting   in   Beijing
 

 

5,最后,我们通过获得指定的Room对象,从而获得该Room对应的User们。
public void getUsersBelongToOneRoom(){
		SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		
//		String hql="FROM Room WHERE address='Beijing'";
//		Query rooms=session.createQuery(hql);
//		List list=rooms.list();
//		Iterator iterator=list.iterator();
//		Room room=(Room) iterator.next();
		
		Room room=(Room) session.load(Room.class, 19);
		System.out.println("Size is: "+room.getUsers().size());
		Iterator iteratorUsers=room.getUsers().iterator();
		while(iteratorUsers.hasNext()){
			User user=(User) iteratorUsers.next();
			System.out.println(user.getName());
		}
		
		session.close();
	}
 
其中上述代码被注释掉的是第二种获得该Room对象的方法。
本来认为应该输出ZhangYu和ZhaoManting的信息,但是却没有。
事实证明获得的Room对象中的Set是空的,size为0。不知道是为什么???
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值