多对一映射

多对一:

这里举例:User类与Group类,

一个Group中是有多个User的。具体数据库表现为在Group类的主键作为User类的外键。

POJO:

package com.lwf.hibernate.pojo;

public class User {

	private int id;
	private String name;
	private Group group = new 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;
	}
}

 

package com.lwf.hibernate.pojo;

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;
	}
}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<hibernate-mapping package="com.lwf.hibernate.pojo">
	
		<class name="User" table="t_user">
			<id name="id">
				<generator class="native"></generator>
			</id>
			<property name="name"></property>
			<many-to-one name="group" column="group_id" cascade="all" ></many-to-one>
		</class>
		<class name="Group" table="t_group">
		
			<id name="id">
				<generator class="native"></generator>
			</id>
			<property name="name"></property>
		</class>
		
	</hibernate-mapping>

 

测试类:

package com.lwf.hibernate.test;

import junit.framework.TestCase;

import org.hibernate.Session;

import com.lwf.hibernate.pojo.Group;
import com.lwf.hibernate.pojo.User;
import com.lwf.hibernate.util.HibernateUtil;

public class Many2one_Test extends TestCase{

	public void testUser(){
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		try{
			Group g = new Group();
			g.setName("group1");
			//session.save(g);
			//如果不保存group那么<many-to-one name="group" column="group_id" cascade="all" />中的cascade="all" 必须设置.
			for (int i = 0; i < 5; i++) {
				User u = new User();
				u.setName("user");
				u.setGroup(g);
				session.save(u);
			}
			
			
			HibernateUtil.commit(session);
		}catch(Exception e){
			HibernateUtil.roolback(session);
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
	public void testLoad(){
		
		Session session = null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			User user = (User)session.load(User.class, 1);
			System.out.println(user.getName());
			System.out.println(user.getGroup().getName());
			
			HibernateUtil.commit(session);
		}catch(Exception e){
			HibernateUtil.roolback(session);
		}finally{
			HibernateUtil.closeSession(session);
		}
		
	}
	
}

 

注意点:

一、了解cascade="all"的使用.如果设置了级联,那么保存User的时候会自动先保存Group。否则如果不调用session.save(g);会报错。

二、观察testLoad方法,我们发现发出了如下SQL语句:

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.group_id as group3_0_0_ from t_user user0_ where user0_.id=?
user
Hibernate: select group0_.id as id1_0_, group0_.name as name1_0_ from t_group group0_ where group0_.id=?
group1

 

即发出了两条SQL,先查出user的group_id,然后再通过group_id到group对象查询name

那么我们知道在数据库操作上是可以通过连接来查询出的:

mysql> select u.name,g.name from t_user u left outer join t_group g on u.group_id=g.i
d;

 那么其实我们在many-to-one上增加fetch属性即可实现这个查询

如下:

<many-to-one name="group" column="group_id" cascade="all" fetch="join" ></many-to-one>

 

再来测试一下,这时通过testLoad方法发出的SQL语句是:

Hibernate: select user0_.id as id0_1_, user0_.name as name0_1_, user0_.group_id as group3_0_1_, group1_.id as id1_0_, group1_.name as name1_0_ from t_user user0_ left outer join t_group group1_ on user0_.group_id=group1_.id where user0_.id=?
user
group1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值