您的位置:首页 > 其它

一对多双向关联

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: