Hibernate 下实现数据的级联插入

       在上一篇文档中,主要讲了如何在myeclipse中部署一个Hibernate项目,在本文中主要实现数据的级联插入,下面模拟的场景是用户有多个订单,在插入用户的时候,将用户的订单添加到订单表中。

     下面是User 和 Order两个pojo类的代码

        

public class Order {

	private int id;
	
	private int whoid;   // thi id of the order's User

	private User user;
	
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getWhoid() {
		return whoid;
	}

	public void setWhoid(int whoid) {
		this.whoid = whoid;
	}
	
	
	
}

public class User {
	
	private int id;
	
	private String username;
	
	private String password;
	
	//这里需要注意的是使用集合必须使用Set,而不能用HashSet,否者在插入数据的时候会抛出一个参数不匹配异常
	private Set<Order> orders;
	
	

	public Set<Order> getOrders() {
		return orders;
	}

	public void setOrders(Set<Order> orders) {
		this.orders = orders;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	
	
}

下面这个是UserDao,这个就没有什么好说的了

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.example.domain.User;

public class UserDao {

	private Session session;
	
	public UserDao(Session session )
	{
		this.session = session;
	}
	
	public void savaUser(User user)
	{
		Transaction tx = session.beginTransaction();
		
		try
		{
			session.save(user);
			tx.commit();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
			tx.rollback();
		}
	}
	
	
}

下面的这两个hbm.xml文件十分重要

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          
<hibernate-mapping>
	<class name="com.example.domain.User" table="user" >
		<id name="id" column="id" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
	
	<property name="username" column="username" type="java.lang.String"></property>
	<property name="password" column="password" type="java.lang.String"></property>
	
	<set name="orders" cascade="save-update" inverse="false" >
		<key column="whoid"></key>
		<one-to-many class="com.example.domain.Order"/>
	</set>
	</class>
</hibernate-mapping>

  其中要理解的就是set这个标签,这个标签对应了User对象中的集合对象,name依然是User中属性的名字,inserse为false表示了这种一对多的关系由User来维护,默认值就是false,那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录, 比如说当User的状态发生了改变,这种改变会延伸到每一个关联到这个User的Order上。

key标签用来表明,这两个关系是通过那个属性来连接的,那么Order表中的外键是whoid,那么这两个关系是通过whoid来维护的。one-to-many表示一对多的关系,其中class表示Set集合中的对象类型,也可以这么理解,即一对多的关系,多的一方的类型是什么。



Order.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 <hibernate-mapping>
 	<class name="com.example.domain.Order" table="Orders">
 		<id name="id" column="id" type="java.lang.Integer">
 			<generator class="increment"></generator>
 		</id>
 	
 		
 		<many-to-one name="user" class="com.example.domain.User" column="whoid"></many-to-one>
 		
 	</class>
 
 
 </hibernate-mapping>

其中的 many-to-one,表示多对一的关系,name表示Order中表示用来关联用户的那个属性的名称,class表示一的那一方的类型,column表示关联关系中用来连接的列,这里仍然是whoid。



下面是测试代码

public class Test {

	public static void main(String args[])
	{
		User user = new User();
		user.setUsername("Neway");
		user.setPassword("admin");
		HashSet<Order> orders  = new HashSet<Order>();
		Order o1 = new Order();
		Order o2 = new Order();
		Order o3 = new Order();
		orders.add(o1);
		orders.add(o2);
		orders.add(o3);
		user.setOrders(orders);
		
		Session session = HibernateSessionFactory.getSession();
		UserDao dao = new UserDao(session);
		dao.savaUser(user);
		

		
	}
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值