HIbernate级联删除(hibernate 双向一对多中 主表设置cascade="all-delete-orphan",在save时出现
2009-10-22 00:44
555 查看
数据库为:Oracle 9i 主表为: 用户表(member) create table member ( member_id number(10,0) not null, name varchar2(10 char), sex varchar2(1 char), primary key (member_id) ) 从表为: 订单表(orders) create table orders ( Order_id number(10,0) not null, total_price float, member_id number(10,0), primary key (Order_id) ) alter table orders add constraint FKC3DF62E5CDAA53AA foreign key (member_id) references member 双向关联映射细分: 在主表member的关系映射文件中: 1)一端(member)中对多端(order)采取了延迟加载策略:lazy="true"默认 2)将多端(order)的传播持久性(级联)设置为最全面的全部级联(包括孤儿模式):cascade="all-delete-orphan" 3)将维护关系的控制权交给多端(order):inverse="true" 在从表orders的关系映射文件中: 1)多端(order)对一端(member)采取了预先抓取策略:fetch="join"(并且要把一端‘member’映射文件的class标签的lazy属性设置为false) 2)将一端(member)的传播持久性(级联)设置为存储、更新:cascade="save-update" 用户表member(主表): <hibernate-mapping> <class name="hbp.ch04.ex03.model.Member" table="member" lazy="false"> <id name="memberId" column="member_id" type="java.lang.Integer"> <generator class="native"> </generator> </id> <property name="name" column="name" type="java.lang.String" length="10"> </property> <property name="sex" column="sex" type="java.lang.String" length="1"> </property> <set name="orders" order-by="order_id" inverse="true" lazy="true" cascade="all-delete-orphan"> <key column="member_id"> </key> <one-to-many class="hbp.ch04.ex03.model.Order"/> </set> </class> </hibernate-mapping> 订单表orders(从表) <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse - Hibernate Tools --> <hibernate-mapping> <class name="hbp.ch04.ex03.model.Order" table="orders"> <id name="orderId" column="Order_id" type="java.lang.Integer"> <generator class="native"> </generator> </id> <property name="totalPrice" column="total_price" type="java.lang.Float"> </property> <many-to-one name="member" column="member_id" class="hbp.ch04.ex03.model.Member" cascade="save-update" fetch="join"> </many-to-one> </class> </hibernate-mapping> pojo类: Member------------------------ import java.util.HashSet; import java.util.Set; public class Member { // Fields private Integer memberId; private String name; private String sex; private Set orders; // Constructors /** default constructor */ public Member() { // TODO Auto-generated constructor stub } // Property accessors /** * @return the orders */ public Set getOrders() { if (orders == null) { orders = new HashSet(); } return orders; } // 其他 get/set访问方法省略。。。。。 } Order----------------- public class Order { // Fields } Member的DAO类(DAO实现的接口省略。。。) import org.hibernate.*; import util.HibernateSessionFactory; import hbp.dao.MemberDAO; import hbp.model.Member; import hbp.model.Order; public class HibernateMemberDAO implements MemberDAO { public void deleteMember(Integer memberId) { // TODO Auto-generated method stub Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); Member member = (Member)session.get(Member.class, memberId); session.delete(member); session.getTransaction().commit(); session.close(); } public Member getMemberById(Integer memberId) { // TODO Auto-generated method stub Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); Member member = (Member)session.get(Member.class, memberId); //Hibernate.initialize(member.getOrders()); session.getTransaction().commit(); return member; } public Order getOrderById(Integer orderId) { // TODO Auto-generated method stub Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); Order order=(Order)session.get(Order.class, orderId); //Hibernate.initialize(order.getMember()); session.getTransaction().commit(); return order; } public void saveMember(Member member) { // TODO Auto-generated method stub Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); session.save(member); session.getTransaction().commit(); } public void saveOrder(Integer memberId, Order order) { // TODO Auto-generated method stub Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); Member member = (Member)session.get(Member.class, memberId); order.setMember(member); member.getOrders().add(order); session.save(member); session.getTransaction().commit(); } public void delete_orphan(Member member,Order order) { Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); member.getOrders().remove(order); session.save(member); session.getTransaction().commit(); } } 测试方法: import java.util.HashSet; import hbp.dao.hibernate.HibernateMemberDAO; import hbp.model.Member; import hbp.model.Order; import junit.framework.TestCase; public class HibernateMemberDAO03Test extends TestCase { public void testSaveMember(){ HibernateMemberDAO memberDAO = new HibernateMemberDAO(); Member member, member2, member3; member = new Member(); member.setName("李四"); member.setSex("f"); member.setOrders(new HashSet()); memberDAO.saveMember(member); member2 = new Member(); member2.setName("王五"); member2.setSex("m"); member2.setOrders(new HashSet()); memberDAO.saveMember(member2); member3 = new Member(); member3.setName("张三"); member3.setSex("m"); member3.setOrders(new HashSet()); memberDAO.saveMember(member3); } public void testSaveOrder() { HibernateMemberDAO memberDAO = new HibernateMemberDAO(); Order order = new Order(); order.setTotalPrice(new Float(12.34)); memberDAO.saveOrder(new Integer(3), order); } public void testGetMemberById() { HibernateMemberDAO memberDAO = new HibernateMemberDAO(); Member member = memberDAO.getMemberById(new Integer(3)); System.out.println("会员姓名:" + member.getName()); System.out.println("订单数量:" + member.getOrders().size()); } public void testGetOrderById() { HibernateMemberDAO memberDAO = new HibernateMemberDAO(); Order order = memberDAO.getOrderById(new Integer(4)); System.out.println("会员姓名:" + order.getMember().getName()); System.out.println("订单价格:" + order.getTotalPrice()); } public void testDeleteMember() { /* HibernateMemberDAO memberDAO = new HibernateMemberDAO(); memberDAO.deleteMember(new Integer(2)); memberDAO.deleteMember(new Integer(3)); */ HibernateMemberDAO memberDAO = new HibernateMemberDAO(); Member member = memberDAO.getMemberById(new Integer(3)); Order order = memberDAO.getOrderById(new Integer(4)); memberDAO.delete_orphan(member, order); } } http://hi.baidu.com/farmer521/blog/item/efb87e86a70a342dc65cc3ca.html |
相关文章推荐
- hibernate cascade="all-delete-orphan"(所有-删除-孤儿)释疑
- 晕,hibernate 的 merge和cascade="all-delete-orphan"要慎重合在一起使用
- cascade="all-delete-orphan"时容易出现的一个异常
- cascade="all-delete-orphan" 处理
- 晕,hibernate 的 merge和cascade="all-delete-orphan"要慎重合在一起使用
- org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance:
- HibernateException - A collection with cascade="all-delete-orphan" was no longer referenced by the o
- Hibernate逍遥游记-第5章映射一对多-02双向(<set>、<key>、<one-to-many>、inverse、cascade="all-delete-orphan")
- org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance:
- cascade="all-delete-orphan" 处理
- cascade="all-delete-orphan"时容易出现的一个异常
- Hibernate中cascade为all-delete-orphan与all的区别
- 调用hibernate的save(Object object)时出现"索引中丢失in 或 out...
- Don't dereference a collection with cascade="all-delete-orphan" ,这是14年遇到的问题,最近在博客上进行整理汇总
- hibernate3的cascade导致deleted object would be re-saved by cascade与 A collection with cascade="all-dele
- Hibernate Set Cascade Example (save, update, delete and delete-orphan)
- 取消hibernate的双向维护,以及引用cascade="delete"
- Hibernate中单向一对多,单向多对一,双向一对多 inverse="true" casecade="save-update"的理解
- Hibernate5-1对多(1:n)-级联删除-cascade="delete-orphanl"
- hibernate cascade属性 all-delete-orphan