一对多双向关联

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();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值