Hibernate关联映射

本文深入探讨Hibernate ORM框架的使用方法,包括如何通过面向对象方式操作数据库,执行查询、更新、删除等操作。文章还介绍了HQL与SQL的区别,以及如何在复杂的业务逻辑下选择合适的查询方式。此外,文中详细讲解了Hibernate的主键生成策略和关联映射,以及级联操作的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                            11/5  Hibernate

  1. Hibernate 是一个orm 框架(解释什么是hibernate)
  2. 以面向对象方法操作数据库

执行语句有以下几种:

1.session  提供的方法: get   ,   load , delete ,save,  update 但是不能查找所有信息

2.hql  更新数据,先查询再进行删改,不能执行插入操作

3.sql  可以直接增删改,原生态的单张表,多张表,多张表的增删改改查,先用session,再用hql实在不行了,业务逻辑比较复杂,只能用原生态的sql

 inverse  "反转" 指定 了关联关系中的方向

inverse="false" 为主动方由主动方负责维护关联关系

在一对多关联中,将“—”方的 inverse 设置为true,这将有助于性能的改善<set name="students" inverse="true"></set>

 

有时候Hibernate没有提供相应的功能(ApI)的时候,我们可以用传统的sql Hibernate是支持sql语句的。

1.使用传统SQL语句

//传统sql查询学生表

public static void doquery3(){

Session session=new Configuration().configure().buildSessionFactory().openSession();

String sql="select * from student";

SQLQuery sqlquery=session.createSQLQuery(sql);

List<Object[]> list=sqlquery.list();

session.close();

for (int i = 0; i < list.size(); i++) {

System.out.println(list.get(i)[1]+" "+list.get(i)[2]);

}

}

2.使用hql语句查询

public static void doquery4(){

Session session=new Configuration().configure().buildSessionFactory().openSession();

String sql="from Student"; //from 后面跟表名相对应的类名

Query query=session.createQuery(sql);

List<Student> list=query.list();

session.close();

for (int i = 0; i < list.size(); i++) {

System.out.println(list.get(i).getSname()+" "+list.get(i).getSex());

}

}

 

框架只能解决大部分通用的问题,针对性的问题还是要借助传统基本语法。

Classcast 类型转换

Hql语法 跟SQL语法是一样的,只不过需要注意的是字段名改为类属性名,表名改为类名

一,Hibernate 自增(主键生成策略)整型

①<generator class=”increment” />

或用数据库自动自增

②<generator class=”sequence” />

二.主键自增字符串类型

<generator class=”uuid” />

主键生成策略:如果ID是整型,可以用increment或sequence,如果是字符串可以用uuid.

Hibernate关联映射

级联(cascade)

当Hibernate持久化一个临时对象时,在默认情况下,它不会自动持久化所关联的其他临时对象,而是会抛出TransientObjectException。如果设定many-to-one元素的cascade属性为save-update的话,可实现自动持久化所关联的对象。

 

代码块:=========================================================

package com.user.test;

 

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

 

import org.hibernate.Query;

import org.hibernate.SQLQuery;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

 

import com.user.entity.Grade;

import com.user.entity.Student;

import org.junit.*;

 

public class test_001 {

 

public static void main(String[] args) {

// add();

// doDelete();

// doquery();

// doquery2();

// update();

// doquery3();

doquery4();

}

 

public static void add() {

Student student1 = new Student(1015, "张积极", "男");

Student student2 = new Student(1016, "李华", "男");

Set<Student> students = new HashSet<Student>();

students.add(student1);

students.add(student2);

Grade grade = new Grade(103, "三年级二班", "java开发", students);// 根据班级找到学生

student1.setGrade(grade);// 根据学生找到班级

student2.setGrade(grade);// 根据学生找到班级

Session session = new Configuration().configure().buildSessionFactory().openSession();

Transaction tx = session.beginTransaction();

// save方法

session.save(grade);

// session.save(student1);

// session.save(student2);

tx.commit();

// 关闭session

session.close();

}

 

@Test

// 删除班级,及班级内所有学生信息

public static void doDelete() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

Grade grade = (Grade) session.load(Grade.class, 101);

Set<Student> stus = grade.getStudents();

if (stus.size() > 0) {

System.out.println("班级有学生无法删除");

} else {

Transaction tx = session.beginTransaction();

session.delete(grade);

tx.commit();

}

session.close();

}

 

// 根据班级查班级里所有学生

public static void doquery() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

Grade grade = (Grade) session.load(Grade.class, 101);

// 迷糊

Set<Student> stus = grade.getStudents();

for (Iterator iterator = stus.iterator(); iterator.hasNext();) {

Student student = (Student) iterator.next();

System.out.println(student.getSname() + " " + student.getSex());

}

session.close();

}

 

// 根据学生查询班级

public static void doquery2() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

Student stu = (Student) session.load(Student.class, 1011);

Grade grade = stu.getGrade();

System.out.println(grade.getGname() + " " + grade.getGdesc());

session.close();

}

 

// 删除一个学生记录

public static void delStudent() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

Transaction tx = session.beginTransaction();

Student stu = (Student) session.load(Student.class, 1012);

session.delete(stu);

tx.commit();

session.close();

}

 

// 修改班级信息 修改班级信息 gdesc-->"一个c#班级",同时把班级中张三的名字改为-->张山

// 得到班级 根据班级得到张三的信息, 调用session.update 实现

public static void update() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

Grade grade = (Grade) session.load(Grade.class, 102);

grade.setGdesc("一个c#班级");

Boolean flag = false;

Set<Student> stus = grade.getStudents();

for (Iterator iterator = stus.iterator(); iterator.hasNext();) {

Student student = (Student) iterator.next();

if (student.getSname().equals("张三")) {

student.setSname("张山");

flag = true;

break;

}

}

Transaction tx = session.beginTransaction();

session.update(grade);

tx.commit();

if (flag) {

System.out.println("修改学生成功");

} else {

System.out.println("学生中没张三");

}

session.close();

}

 

// 传统sql查询学生表

public static void doquery3() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

String sql = "select * from student";

SQLQuery sqlquery = session.createSQLQuery(sql);

List<Object[]> list = sqlquery.list();

session.close();

for (int i = 0; i < list.size(); i++) {

System.out.println(list.get(i)[1] + " " + list.get(i)[2]);

}

}

// hql查询学生表

public static void doquery4() {

Session session = new Configuration().configure().buildSessionFactory().openSession();

String sql = "from Student";

Query query = session.createQuery(sql);

List<Student> list = query.list();

session.close();

for (int i = 0; i < list.size(); i++) {

System.out.println(list.get(i).getSname() + " " + list.get(i).getSex());

}

}

}
//分页模糊查询
		@Override
		public Object[]  queryAll(String strPage,String userName){
			int pages = 0; // 待显示页面
			UserService service = new UserServiceImpl();
			String sql = "from Users where userName like '%" + userName + "%'";
			String sql1 = "select * from Users where userName like '%" + userName + "%'";
			Session session = new Configuration().configure().buildSessionFactory().openSession();
			Query query= session.createQuery(sql);
			List<Users> list = service.getUsers(sql1);
			int totalpages = list.size() / 3;
			int yu = list.size() % 3;
			if (yu != 0) {
				totalpages = totalpages + 1;
			}
			System.out.println(totalpages+"like页数");
			
			// 判断当前页面参数的合法性并处理非法页号(为空则显示第一页,小于0则显示第一页,大于总页数则显示最后一页)
			if (strPage == null) {
				pages = 1;
			} else {
				try {
					pages = java.lang.Integer.parseInt(strPage);
				} catch (Exception e) {
					pages = 1;
				}
				if (pages < 1) {
					pages = 1;
				}
				if (pages > totalpages) {
					pages = totalpages;
				}
			}
			query.setFirstResult((pages-1)*3);
			query.setMaxResults(pages*3);
			List<Users> list1= query.list();
			session.close();
			Object[] list2={list1,pages,totalpages};
			return list2;
		}
		//查询所有分页
		@Override
		public Object[]  queryAll2(String strPage){
			int pages = 0; // 待显示页面
			UserService service = new UserServiceImpl();
			String sql = "from Users order by userID desc";
			String sql1 = "select * from users";
			Session session = new Configuration().configure().buildSessionFactory().openSession();
			Query query= session.createQuery(sql);
			List<Users> list = service.getUsers(sql1);
			int totalpages = list.size() / 3;
			int yu = list.size() % 3;
			if (yu != 0) {
				totalpages = totalpages + 1;
			}
			System.out.println(totalpages+"like页数");
			
			// 判断当前页面参数的合法性并处理非法页号(为空则显示第一页,小于0则显示第一页,大于总页数则显示最后一页)
			if (strPage == null) {
				pages = 1;
			} else {
				try {
					pages = java.lang.Integer.parseInt(strPage);
				} catch (Exception e) {
					pages = 1;
				}
				if (pages < 1) {
					pages = 1;
				}
				if (pages > totalpages) {
					pages = totalpages;
				}
			}
			query.setFirstResult((pages-1)*3);
			query.setMaxResults(pages*3);
			List<Users> list1= query.list();
			session.close();
			Object[] list2={list1,pages,totalpages};
			return list2;
		}

 

 

 

 

 

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值