Hibernate映射(二)— 多对一


情况:

    多个用户在一个组,一个组包含多个用户,用户端维护关系(多的一端维护关系)

原理:

在多的一端加入一个外键,指向一的一端

关系图:

整体与部分的关系:使用聚合


具体实现


1、实体    

<span style="font-size:18px;">User:
	public class User {
	
		private int id;
		
		private String name;
		
		private Group group;
	
		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 Group getGroup() {
			return group;
		}
	
		public void setGroup(Group group) {
			this.group = group;
		}
	}
	
      Group:
	public class Group {
	
		private int id;
		
		private String name;
	
		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;
		}
	}
</span>

 

2、映射文件

<span style="font-size:18px;">User:
	<hibernate-mapping>
		<class name="com.bjpowernode.hibernate.User" table="t_user">
			<id name="id">
				<generator class="native"/>
			</id>
			<property name="name"/>
			<many-to-one name="group" column="groupid" />
		</class>
	</hibernate-mapping>
Group
	<hibernate-mapping>
		<class name="com.bjpowernode.hibernate.Group" table="t_group">
			<id name="id">
				<generator class="native"/>
			</id>
			<property name="name"/>
		</class>
	</hibernate-mapping>
</span>

3、配置文件

<span style="font-size:18px;">	<hibernate-configuration>
		<session-factory>
			<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_many2one</property>
			<property name="hibernate.connection.username">root</property>
			<property name="hibernate.connection.password">bjpowernode</property>
			<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
			<property name="hibernate.show_sql">true</property>
			
			<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
			<mapping resource="com/bjpowernode/hibernate/Group.hbm.xml"/>
		</session-factory>
	</hibernate-configuration>
</span>

 

4、封装好的工具类:HibernateUtils

<span style="font-size:18px;">	public class HibernateUtils {
	
		private static SessionFactory factory;
		
		static {
			try {
				//读取hibernate.cfg.xml文件
				Configuration cfg = new Configuration().configure();
				
				//建立SessionFactory
				factory = cfg.buildSessionFactory();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		//开启session
		public static Session getSession() {
			return factory.openSession();
		} 
		
		//关闭session
		public static void closeSession(Session session) {
			if (session != null) {
				if (session.isOpen()) {
					session.close();
				}
			}
		}
		
		//用来获取session
		public static SessionFactory getSessionFactory() {
			return factory;
		}
	}
</span>

5、添加

情况1:进行保存时,两个实体都为Persistent状态

<span style="font-size:18px;"><span style="font-size:12px;">		</span><span style="font-size:18px;">public void testSave1() {
				Session session = null;
				try {
					session = HibernateUtils.getSession();
					session.beginTransaction();
					
					Group group = new Group();
					group.setName("动力节点");
					session.save(group);
					
					User user1 = new User();
					user1.setName("张三");
					user1.setGroup(group);
					
					User user2 = new User();
					user2.setName("李四");
					user2.setGroup(group);
					
					session.save(user1);
					session.save(user2);
					//可以正确的保存数据
					//因为Group和User都是Persistent状态的对象
					//所以在hibernate清理缓存时在session中可以找到关联对象
					session.getTransaction().commit();
				}catch(Exception e) {
					e.printStackTrace();
					session.getTransaction().rollback();
				}finally {
					HibernateUtils.closeSession(session);
				}

}	</span></span>


}        

情况2User映射文件添加cascade="save-update"

 

<span style="font-size:18px;">	public void testSave3() {
			Session session = null;
			try {
				session = HibernateUtils.getSession();
				session.beginTransaction();
				
				Group group = new Group();
				group.setName("动力节点");
				
				User user1 = new User();
				user1.setName("张三");
				user1.setGroup(group);
				
				User user2 = new User();
				user2.setName("李四");
				user2.setGroup(group);
				
				session.save(user1);
				session.save(user2);
				
				//没有抛出TransientObjectException异常
				session.getTransaction().commit();
			}catch(Exception e) {
				e.printStackTrace();
				session.getTransaction().rollback();
			}finally {
				HibernateUtils.closeSession(session);
			}
		}
</span>


:

    因为使用了级联特性,hibernate会首先保存User的关联对象对象Group,然后GroupUser就都是Persistent状态的对象了        

结果:


 

6、查询

<span style="font-size:18px;">	public void testLoad1() {
			Session session = null;
			try {
				session = HibernateUtils.getSession();
				session.beginTransaction();
				User user = (User)session.load(User.class, 3);
				System.out.println("user.name=" + user.getName());
				System.out.println("user.group.name=" + user.getGroup().getName());
				session.getTransaction().commit();
			}catch(Exception e) {
				e.printStackTrace();
				session.getTransaction().rollback();
			}finally {
				HibernateUtils.closeSession(session);
			}

}	</span>



         下篇博文介绍Hibernate映射中的一对一。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值