Hibernate关联映射

                            11/5  Hibernate

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

有时候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关联映射

Hibernate关联映射

Hibernate关联映射

Hibernate关联映射

Hibernate关联映射

Hibernate关联映射

级联(cascade)

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

Hibernate关联映射

Hibernate关联映射

 

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

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

}

}

}