hibernate - 自连接(反身连接)

package com.demo.common.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.demo.Util.HibernateUtil;


public class BaseDao<T,PK extends Serializable> implements IBaseDao<T,PK> 
{
	protected  SessionFactory sessionFactory= HibernateUtil.getSessionFactory();

	//1.声明T泛型的具体类
	private Class<T> clazz;
	//2.默认的构造函数中初始化 T泛型的具体类
	public BaseDao() {
		 ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		 clazz = (Class<T>) type.getActualTypeArguments()[0];
		 
		
		 
//	     System.out.println(this.clazz.getName());
//	     System.out.println(this.clazz.getSimpleName());
//	     System.out.println(this.clazz.getTypeName());
	  
	}
	
	
	public void save(T entity) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		
		//3.执行会话  CRUD API
		session.save(entity);
		
		//4.提交事务
		session.getTransaction().commit();
	}

	public void update(T entity) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		session.update(entity);
		//4.提交事务
		session.getTransaction().commit();
		
	}

	public void delete(T entity) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		session.delete(entity);
		//4.提交事务
		session.getTransaction().commit();
		
	}

	public T findOne(PK id) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		T entity = session.get(this.clazz, id);
		//Event event = session.load(Event.class, id);
		//4.提交事务
		session.getTransaction().commit();
		
		return entity;
	}

	public List<T> findAll() {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		List<T> result = session.createQuery("from " +this.clazz.getSimpleName()).list();//HQL
		//List<Event> result = session.createSQLQuery("select * from t_event").list();//SQL
		
		//4.提交事务
		session.getTransaction().commit();

		return result;
	}

}

首先实现需求树结构有父节点,中间儿子节点,三层节点,多层节点,并只删除中间节点

首先定义类:

package com.demo.common.entity;

import java.io.Serializable;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

@MappedSuperclass
public class BaseEntity<PK extends Serializable> 
{
	
	private PK id;
	//系统维护公共属性
	//创建人
	//创建时间
	//修改人
	//最后修改时间
	
	//数据权限标识
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	//@GeneratedValue(strategy=GenerationType.SEQUENCE)
	public PK getId() {
		return id;
	}
	
	public void setId(PK id) {
		this.id = id;
	}
}

这是管理类id模板;

定义Menu 类:

package com.demo.ex04.self2self.entity;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;

import com.demo.common.entity.BaseEntity;


@Entity
@Table(name="t_Menu")
public class Menu extends BaseEntity<Long> {
	
	private Menu parentMunu;
	private List<Menu> listmenu = new ArrayList<Menu>();
	private String menuName;
	
	private Integer grade; //菜单等级  
	private Integer morder; //同一级菜单中的顺序 
	
	@ManyToOne(fetch = FetchType.LAZY , cascade=CascadeType.ALL) 
	@JoinColumn(name = "parent_id")
	public Menu getParentMunu() {
		return parentMunu;
	}
	
	
//	public Long getParent_id() {
//		return parent_id;
//	}
//
//	public void setParent_id(Long parent_id) {
//		this.parent_id = parent_id;
//	}

	@OneToMany(targetEntity = Menu.class, cascade = CascadeType.ALL, 
			mappedBy = "parentMunu") 
	@OrderBy("morder")
	public List<Menu> getListmenu() {
		return listmenu;
	}
	public String getMenuName() {
		return menuName;
	}
	public Integer getGrade() {
		return grade;
	}
	public Integer getMorder() {
		return morder;
	}
	public void setParentMunu(Menu parentMunu) {
		this.parentMunu = parentMunu;
	}
	public void setListmenu(List<Menu> listmenu) {
		this.listmenu = listmenu;
	}
	public void setMenuName(String menuName) {
		this.menuName = menuName;
	}
	public void setGrade(Integer grade) {
		this.grade = grade;
	}
	public void setMorder(Integer morder) {
		this.morder = morder;
	}
	
	

	

}
实现数据持久层Dao
package com.demo.common.dao;

import java.io.Serializable;
import java.util.List;

/**
 * Dao层基础功能接口(重用方法)
 *1.jdk1.5的新特性---泛型。这是定义在接口上的泛型,继承了Serializable(序列化),也就省去了强制转换。可以传输对象。
  *2. BaseDao<Serializable>这样做就没有用到泛型。
  *3.最好实现,还有hashcode和equals方法。 
 */
public interface IBaseDao<T,PK extends Serializable>
{
	public void save(T entity);
	public void update(T entity);
	public void delete(T entity);
	public T findOne(PK id);
	public List<T> findAll();
}
package com.demo.common.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.demo.Util.HibernateUtil;


public class BaseDao<T,PK extends Serializable> implements IBaseDao<T,PK> 
{
	protected  SessionFactory sessionFactory= HibernateUtil.getSessionFactory();

	//1.声明T泛型的具体类
	private Class<T> clazz;
	//2.默认的构造函数中初始化 T泛型的具体类
	public BaseDao() {
		 ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		 clazz = (Class<T>) type.getActualTypeArguments()[0];
		 
		
		 
//	     System.out.println(this.clazz.getName());
//	     System.out.println(this.clazz.getSimpleName());
//	     System.out.println(this.clazz.getTypeName());
	  
	}
	
	
	public void save(T entity) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		
		//3.执行会话  CRUD API
		session.save(entity);
		
		//4.提交事务
		session.getTransaction().commit();
	}

	public void update(T entity) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		session.update(entity);
		//4.提交事务
		session.getTransaction().commit();
		
	}

	public void delete(T entity) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		session.delete(entity);
		//4.提交事务
		session.getTransaction().commit();
		
	}

	public T findOne(PK id) {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		T entity = session.get(this.clazz, id);
		//Event event = session.load(Event.class, id);
		//4.提交事务
		session.getTransaction().commit();
		
		return entity;
	}

	public List<T> findAll() {
		//1.创建会话
		Session session = sessionFactory.getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		List<T> result = session.createQuery("from " +this.clazz.getSimpleName()).list();//HQL
		//List<Event> result = session.createSQLQuery("select * from t_event").list();//SQL
		
		//4.提交事务
		session.getTransaction().commit();

		return result;
	}

}
package com.demo.ex04.self2self.dao;

import com.demo.common.dao.IBaseDao;
import com.demo.ex04.self2self.entity.Menu;

public interface IparentDao extends IBaseDao<Menu,Long> {

}

package com.demo.ex04.self2self.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.query.Query;

import com.demo.Util.HibernateUtil;
import com.demo.common.dao.BaseDao;
import com.demo.ex04.many2one.entity.Company;
import com.demo.ex04.self2self.entity.Menu;

public class parentDao extends BaseDao<Menu,Long> implements IparentDao  {
	
	
//	public Long findParentIdBymenuname(String menuname){
//		Session session =  HibernateUtil.getSessionFactory().getCurrentSession(); 
//		session.beginTransaction();  
//		Menu menu = new Menu();
//		Query query =  session.createSQLQuery("select parent_id from t_Menu where menuName like %"+menuname+"%");
//		Long result = (Long) query.list().get(0);
//		session.getTransaction().commit();
//
//		return result;
//	}
	
	public Long findselfIdBymenuname(String menuname){
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession(); 
		session.beginTransaction();  
		Menu menu = new Menu();
		Query query =  session.createQuery("select c.id from Menu c where c.menuName like :name");
		query.setParameter("name", "%"+menuname+"%");	
		
		Long result = (Long) query.list().get(0);
		session.getTransaction().commit();

		return result;
	}
	
	public List<Menu> findchildByParentId(Long id){
		List<Menu> result = new ArrayList();
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession(); 
		session.beginTransaction();  
		Menu menu = new Menu();
		String sql = "select * from t_Menu where parent_id = "+id;
		SQLQuery  query =  session.createSQLQuery(sql).addEntity(Menu.class);
		result = query.list();
		session.getTransaction().commit();

		return result;
	}
	
	public Menu findselfBymenuname(String menuname){
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession(); 
		session.beginTransaction();  
		Menu menu = new Menu();
		
		Query query =  session.createQuery("from Menu c where c.menuName like :name");
		query.setParameter("name", "%"+menuname+"%");	
		
		Menu result = (Menu) query.list().get(0);
		session.getTransaction().commit();

		return result;
	}

}

最后测试代码:

package com.demo.Hibernate.ex01;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.demo.Util.HibernateUtil;
import com.demo.ex04.many2one.entity.Company;
import com.demo.ex04.self2self.dao.parentDao;
import com.demo.ex04.self2self.entity.Menu;

public class menuTest {
	private static parentDao parentdao;
	
	
	@BeforeClass
	public static void init(){
		parentdao = new parentDao();
	}
	
	//@Test
	//添加数据,使用多的关系一方管理
	public void test(){
		Menu perantmenu = new Menu();
		perantmenu.setGrade(1);
		perantmenu.setMenuName("A");
		perantmenu.setMorder(1);
		
//		parentdao.save(perantmenu);
//		
//		Menu perantmenu1 = new Menu();
//		perantmenu1 = parentdao.findOne(1L);
		Menu perantmenu2 = new Menu();
		perantmenu2.setGrade(2);
		perantmenu2.setMenuName("B1");
		perantmenu2.setMorder(1);
		Menu perantmenu3 = new Menu();
		perantmenu3.setGrade(2);
		perantmenu3.setMenuName("B2");
		perantmenu3.setMorder(2);
		Menu perantmenu4 = new Menu();
		perantmenu4.setGrade(2);
		perantmenu4.setMenuName("B3");
		perantmenu4.setMorder(3);
		
//		System.out.println(perantmenu1);
		
		Menu sunmenu1 = new Menu();
		sunmenu1.setGrade(3);
		sunmenu1.setMenuName("C1");
		sunmenu1.setMorder(1);
		
		Menu sunmenu2 = new Menu();
		sunmenu2.setGrade(3);
		sunmenu2.setMenuName("C2");
		sunmenu2.setMorder(2);
		
		Menu sunmenu3 = new Menu();
		sunmenu3.setGrade(3);
		sunmenu3.setMenuName("C3");
		sunmenu3.setMorder(3);
		
		Menu sunmenu4 = new Menu();
		sunmenu4.setGrade(3);
		sunmenu4.setMenuName("C4");
		sunmenu4.setMorder(4);
		
		perantmenu2.setParentMunu(perantmenu);
		perantmenu3.setParentMunu(perantmenu);
		perantmenu4.setParentMunu(perantmenu);
		
		sunmenu1.setParentMunu(perantmenu2);
		sunmenu2.setParentMunu(perantmenu2);
		sunmenu3.setParentMunu(perantmenu3);
		sunmenu4.setParentMunu(perantmenu4);
		
		parentdao.save(sunmenu1);
		parentdao.save(sunmenu2);
		parentdao.save(sunmenu3);
		parentdao.save(sunmenu4);
	}
	
	@Test
	//测试递归输出每层结构
	public void testLoad(){    
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession(); 
		session.beginTransaction();  
		Menu o =(Menu) session.load(Menu.class,1L);  
		Treeprint(o,0);  
		session.getTransaction().commit();  
		session.close();  
		}  
		 
	  
	private void Treeprint(Menu o,int level) { 
		String preStr="";  
		    for(int i=0;i<level;i++){  
		        preStr+="----";  
		    }  

		System.out.println(preStr+o.getMenuName());  
		for(Menu child:o.getListmenu()){  
			Treeprint(child,level+1);  
		   }  
		}
	//查询Id
	public Long testLoad1(String b){
		
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession(); 
		session.beginTransaction();  
		Menu o =(Menu) session.load(Menu.class,1L);  
		Long a = Treeprinta(o,b);  
		session.getTransaction().commit();  
		session.close(); 
		return a;
		} 
	private Long Treeprinta(Menu o,String b) { 
		 int a = 0;  
//		System.out.println(o.getMenuName());  
		for(Menu child:o.getListmenu()){ 
			if(b.equals(child.getMenuName())){
				a= 1;
				break;
			}
			Treeprinta(child,b);  
		    }
			if(a==1)
		    return o.getId();
			else
			return null;
		}  
	
	//@Test
	//测试删除中间层
	public void test2(){
		String menu = "B1";
		Long parentid = testLoad1(menu);
		
//		System.out.println(parentid);
		
		Menu parentMenu = new Menu();
		parentMenu = parentdao.findOne(parentid);
		
		Long selfid = parentdao.findselfIdBymenuname(menu);
		
//		System.out.println(selfid);
		
		Menu selfMenu = new Menu();
		selfMenu = parentdao.findselfBymenuname(menu);
		
		List<Menu> childlist =new ArrayList();
		
		
		childlist = findchildByParentId(selfid);
		
		
		for(Menu a : childlist){
			System.out.println(a);		
		}
				
		selfMenu.setParentMunu(null);
		for(int i = 0;i<childlist.size();i++){
			childlist.get(i).setParentMunu(null);		
		}
		

		delete(selfMenu);
		for(int i = 0;i<childlist.size();i++){
			childlist.get(i).setParentMunu(parentMenu);
			childlist.get(i).setGrade(childlist.get(i).getGrade()-1);
		}
		
		for(int i = 0;i<childlist.size();i++){
			Session session2 =  HibernateUtil.getSessionFactory().getCurrentSession();
			session2.beginTransaction();
			session2.save(childlist.get(i));
			session2.getTransaction().commit();
			
		}
       
	}
	
	public List<Menu> findchildByParentId(Long id){
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession();
		List<Menu> result = new ArrayList();		 
		session.beginTransaction();  
		Menu menu = new Menu();
		String sql = "select * from t_Menu where parent_id = "+id;
		SQLQuery  query =  session.createSQLQuery(sql).addEntity(Menu.class);
		result = query.list();
		session.getTransaction().commit();

		return result;
	}
	
	public void delete(Menu entity) {
		//1.创建会话
		Session session =  HibernateUtil.getSessionFactory().getCurrentSession();//创建一个线程安全会话,自动回滚和关闭
		//2.开始事务
		session.beginTransaction();
		//3.执行会话  CRUD API
		session.delete(entity);
		//4.提交事务
		session.getTransaction().commit();
		
	}
	
		
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值