在上一篇文档中,主要讲了如何在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); } }
作者:liuwei0604 发表于2013-5-13 1:25:14 原文链接
阅读:166 评论:0 查看评论