一对多双向关联
2016-05-10 16:45
302 查看
package com.lp.test; import java.util.Iterator; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.lp.bean.Article; import com.lp.bean.Category; public class Main { public static void main(String[] args) { Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); //cascadeSave(sessionFactory); //cascadeSaveZang(sessionFactory); //cascadeDeleteOrphan(sessionFactory); } private static void cascadeDeleteOrphan(SessionFactory sessionFactory) { /* Hibernate: select category0_.category_id as category1_1_0_, category0_.category_title as category2_1_0_, category0_.category_createtime as category3_1_0_ from category category0_ where category0_.category_id=? Hibernate: select articles0_.category_id as category5_1_, articles0_.article_id as article1_1_, articles0_.article_id as article1_0_0_, articles0_.article_title as article2_0_0_, articles0_.article_content as article3_0_0_, articles0_.article_createtime as article4_0_0_, articles0_.category_id as category5_0_0_ from article articles0_ where articles0_.category_id=? Hibernate: delete from article where article_id=? */ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Category category = (Category) session.load(Category.class, 20l); Iterator iterator = category.getArticles().iterator(); while(iterator.hasNext()){ Article temp = (Article) iterator.next(); if(temp.getArticleTitle().equals("题目三")){ iterator.remove(); break; } } /* * delete-orphan:删除所有和当前对象解除关联的对象 * 只适用于集合,且处于持久化状态。不用调用delete,解除关系即可 * * 其他: * delete: 删除当前对象,级联删除关联的对象 * all=save-update+delete * all-delete-orphan=all+delete-orphan */ transaction.commit(); session.close(); } private static void cascadeSaveZang(SessionFactory sessionFactory) { /* * Hibernate: select category0_.category_id as category1_1_0_, category0_.category_title as category2_1_0_, category0_.category_createtime as category3_1_0_ from category category0_ where category0_.category_id=? * Hibernate: select articles0_.category_id as category5_1_, articles0_.article_id as article1_1_, articles0_.article_id as article1_0_0_, articles0_.article_title as article2_0_0_, articles0_.article_content as article3_0_0_, articles0_.article_createtime as article4_0_0_, articles0_.category_id as category5_0_0_ from article articles0_ where articles0_.category_id=? * Hibernate: insert into article (article_title, article_content, article_createtime, category_id) values (?, ?, ?, ?) */ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Category category = (Category) session.load(Category.class, 20l); Article article = new Article(); article.setArticleContent("内容三"); article.setArticleTitle("题目三"); //建立关联目录到文章的关联,由于save-update,而目录处于持久化状态,回传给article,自动脏检查 category.getArticles().add(article); //article.setCategory(category); transaction.commit(); session.close(); } private static void cascadeSave(SessionFactory sessionFactory) { /* * Hibernate: insert into category (category_title, category_createtime) values (?, ?) * Hibernate: insert into article (article_title, article_content, article_createtime, category_id) values (?, ?, ?, ?) * Hibernate: insert into article (article_title, article_content, article_createtime, category_id) values (?, ?, ?, ?) */ //分类一 Category category = new Category(); category.setCategoryTitle("分类标题1"); //文章一 Article article = new Article(); article.setArticleContent("内容1"); article.setArticleTitle("文章表题1"); //文章二 Article article1 = new Article(); article1.setArticleContent("内容2"); article1.setArticleTitle("文章表题2"); //建立双向关系 /* * article.setCategory(category);要建立article到category的关系时,主控权在article一方, * hibernate将article写到数据库时,就一起连同外键写入到article对应的表 * * category.getArticles().add(article);主控权在category一方,然而外键并不在category类对应 * 的表中,所以hibernate要生成update语句 * * 双向关联时,在“一”的一方设置inverse=true,放弃主控权,让“多”的一方维护关系,以免不必要的update sql */ article1.setCategory(category); article.setCategory(category); category.getArticles().add(article); category.getArticles().add(article1); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //级联保存 session.save(category); transaction.commit(); session.close(); } }
相关文章推荐
- Oracle 11g for Redhat 6 64位安装步骤
- 远程工具推荐
- 将任意程序(如.bat文件)作为Windows服务运行
- 中国有哪些历史遗产
- SharedPreference对象的获得
- 基于自然语言关键词的打分器
- 大数据学习网站
- PAT-C-4-11 求自定类型元素序列的中位数 (25分)
- php中使用pdo,mysql,等各种乱码情况解决办法
- Android实现天气查询
- Delphi berlin 如何自定义Listview外观样式
- binary complex的MATLAB读取
- C++第五次作业
- Process 'command '/usr/lib/jvm/jdk1.8.0_25/bin/java'' finished with non-zero exit value 2
- String、StringBuffer与StringBuilder之间区别
- ABAQUS二次开发悬臂梁以及ODB文件信息的读取
- 临时数据转化为mysql表与现有表进行join
- 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope
- 155. Min Stack
- WebAPP与原生APP的交互设计区别