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