Hibernate 下实现数据的级联插入
来源:互联网 发布:vb.net 注释 编辑:程序博客网 时间:2024/04/30 04:48
在上一篇文档中,主要讲了如何在myeclipse中部署一个Hibernate项目,在本文中主要实现数据的级联插入,下面模拟的场景是,用户有多个订单,在插入用户的时候,将用户的订单添加到订单表中。
下面是User 和 Order两个pojo类的代码
public class Order {private int id;private int whoid; // thi id of the order's Userprivate 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);}}
- Hibernate 下实现数据的级联插入
- hibernate 级联保存 只有主表有数据,子表没插入数据
- 主题:hibernate级联插入实现多对多
- hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)
- Hibernate目前无法实现的级联
- Hibernate实现级联删除
- Hibernate实现级联删除
- Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN基于注解方式
- hibernate入门--实现数据简单插入
- hibernate的级联----cascade
- Hibernate 表的级联
- hibernate的级联操作
- Hibernate的级联删除
- Hibernate级联的异常
- hibernate的级联操作
- hibernate的级联操作
- Hibernate的级联删除
- hibernate的级联属性
- C/C++中Static的作用详述
- 自定义异常
- Adding Lightbox for Image Plugin in Tinymce
- Android ImageView.ScaleType 属相详解
- 4 款消息队列软件产品大比拼
- Hibernate 下实现数据的级联插入
- Linux启动过程中几个重要配置文件的执行过程
- 【关于idea的jsp-api等冲突】
- 局域网私有IP地址上外网的原理
- 在Android上使用ZXing识别条形码/二维码
- 迈出从3K到1W的重要一步
- 使用 Zsh 的九个理由
- javascript中event.keycode大全及判断是否按下组合键的代码
- 抽象工厂模式---设计模式(好)