为了实现双向多对一,说来也很简单。只需要将上一篇博客《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。不知道是为什么???