Hibernate关联映射
11/5 Hibernate
- Hibernate 是一个orm 框架(解释什么是hibernate)
- 以面向对象方法操作数据库
有时候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());
}
}
}