`

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。不知道是为什么???
分享到:
评论

相关推荐

    Hibernate双向一对多

    标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。...

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate多对多双向关联

    该描述提供了一个博客链接,虽然没有直接给出具体内容,但我们可以假设博客内容会详细解释如何在Hibernate中设置和管理多对多双向关联。这通常包括配置实体类、定义关联映射、使用中间表以及进行增删改查操作。在...

    hibernate双向多对多关联映射(注解版)

    在这个“hibernate双向多对多关联映射(注解版)”的主题中,我们将深入探讨如何使用Hibernate的注解配置来处理数据库中的双向多对多关联关系。 首先,多对多关联在数据库设计中是指两个实体之间存在多个对应关系,...

    hibernate一对多,多对一,一对多双向关联

    1. **关联类型:** Hibernate支持四种基本的关联类型,包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:**...

    hibernate双向一对多关联映射(注解版)

    对于"hibernate双向一对多关联映射(注解版)",我们可以按照以下步骤进行: 1. **定义实体类**:首先,我们需要创建两个实体类,例如`Parent`和`Child`。在`Parent`类中,`Child`是一个集合,而在`Child`类中,`...

    hibernate双向一对多关联映射(XML)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系数据库模型与对象模型之间的映射方式。这种映射允许在一个实体类中存在多个另一个实体类的实例,而在另一个实体类中也可能存在对第一个实体类的...

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    hibernate 双向 多对对,一对多,一对一 映射的 集合

    总结起来,Hibernate的双向多对多、一对多、一对一映射提供了灵活的数据关联方式,使得Java对象和数据库表之间的关系得以顺畅地转换和操作。理解并熟练掌握这些映射关系,对于开发高效、稳定的Java持久层代码至关...

    hibernate双向一对多增删查改的例子

    在Java的持久化框架Hibernate中,双向一对多关联是一种常见的数据模型关系,它涉及到两个实体类,一个实体可以有多个另一个实体的实例。本示例将深入探讨如何使用Hibernate进行双向一对多关系的增删查改操作。 首先...

    hibernate 双向多对多关联映射练习

    在Java的持久化框架Hibernate中,双向多对多关联映射是一种常见的数据关系模型,它允许两个实体类之间存在多个实例互相引用的情况。本练习旨在帮助开发者深入理解并熟练运用这种映射方式。通过以下详细讲解,我们将...

    hibernate 双向一对一基于主键的关联映射

    在Java持久化框架Hibernate中,双向一对一(OneToOne)基于主键的关联映射是一种常见的对象关系映射(ORM)技术。这种映射方式允许两个实体类之间建立一对一的关联,且关联是通过主键来实现的。接下来,我们将深入...

    hibernate双向多对多关联映射(XML)

    本知识点将深入探讨Hibernate中的双向多对多关联映射,并通过XML配置文件进行设置。 在关系型数据库中,多对多(Many-to-Many)关系是两个表之间的一种复杂关联,表示一个实体可以与多个其他实体相关联,反之亦然。...

    Hibernate ORM - 多对多双向连接表关联关系

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    Hibernate一对一唯一外键关联映射(双向关联)

    在上述例子中,我们创建了双向一对一关联。这意味着可以从`EntityA`访问到`EntityB`,也可以从`EntityB`访问到`EntityA`。双向关联可以方便我们在业务逻辑中进行操作,但同时也需要注意维护关联的完整性,避免出现...

Global site tag (gtag.js) - Google Analytics