一、进阶(一)
1、hbm映射配置文件详解
2、Class节点详情
3、id节点详情
4、联合主键
5、映射类型对照表
6、java时间和日期类型的Hibernate映射
Animal实体类(注意birthdays字段)
package com.test.domain;
import java.util.Date;
public class Animal {
private Integer aid;
private String aname;
private Integer age;
private Date birthday;
public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "animal message:" + aid + aname + age;
}
}
Animal.hbm.xml对象关系映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2020-4-6 19:02:52 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping default-lazy="false">
<class name="com.test.domain.Animal" table="ANIMAL">
<id name="aid" type="java.lang.Integer">
<column name="AID" />
<generator class="native" />
</id>
<property generated="never" lazy="false" name="aname"
type="java.lang.String">
<column name="ANAME" />
</property>
<property generated="never" lazy="false" name="age"
type="java.lang.Integer">
<column name="AGE" />
</property>
<!-- 时间日期默认的是datetime类型,这里指定的数据类型是 timestamp-->
<property generated="never" lazy="false" name="birthday" type="timestamp">
<!-- 必须指定sql-type才能精确数据类型大小 -->
<column name="BIRTHDAY" sql-type="timestamp"></column>
</property>
</class>
</hibernate-mapping>
测试类
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate5</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="com/test/domain/Animal.hbm.xml" />
</session-factory>
</hibernate-configuration>
控制台输出
7、大内容属性映射XML设置
Animal实体类(注意birthdays字段)
package com.test.domain;
import java.util.Date;
import com.mysql.jdbc.Blob;
import com.mysql.jdbc.Clob;
public class Animal {
private Integer aid;
private String aname;
private Integer age;
private Date birthday;
private Blob img;
private Clob content;
public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Blob getImg() {
return img;
}
public void setImg(Blob img) {
this.img = img;
}
public Clob getContent() {
return content;
}
public void setContent(Clob content) {
this.content = content;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "animal message:" + aid + aname + age;
}
}
Animal.hbm.xml
测试类
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate5</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="com/test/domain/Animal.hbm.xml" />
</session-factory>
</hibernate-configuration>
控制台输出
8、formula属性详解
Animal实体类
package com.test.domain;
import java.util.Date;
import com.mysql.jdbc.Blob;
import com.mysql.jdbc.Clob;
public class Animal {
private Integer aid;
private String aname;
private Integer age;
private Date birthday;
private Blob img;
private Clob content;
private Integer money;
private Integer comm;
private Integer salary;
public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Blob getImg() {
return img;
}
public void setImg(Blob img) {
this.img = img;
}
public Clob getContent() {
return content;
}
public void setContent(Clob content) {
this.content = content;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
public Integer getComm() {
return comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
// 重写toString方法,输出money
@Override
public String toString() {
// TODO Auto-generated method stub
return "animal worker price :" + money;
}
}
Animal.hbm.xml
测试类
数据库表animal
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate5</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="com/test/domain/Animal.hbm.xml" />
</session-factory>
</hibernate-configuration>
一、进阶(二)
(一)注意
(二)概况
(三)具体事例
1、单向多对一映射配置
详细步骤:
启动Junit测试
数据库
代码解析:
2、双向多对一映射配置
概念
实战
目录结构
Student实体类
package com.hliedu.manytoone.two;
public class Student {
private Integer sid;
private String sname;
// 多端对一端
private Teacher teacher;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return sname;
}
}
Student.hbm.xml
Teacher实体类
package com.hliedu.manytoone.two;
import java.util.HashSet;
import java.util.Set;
public class Teacher {
private Integer tid;
private String tname;
private Set<Student> students = new HashSet<Student>();
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return tname;
}
}
Teacher.hbm.xml
hibernate.cfg.xml需添加
测试类
package com.hliedu.manytoone.two;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HibernateTest {
Configuration cfg = null;
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction = null;
@Before
public void init() {
// TODO Auto-generated method stub
System.out.println("初始化加载");
cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void after() {// 销毁
// TODO Auto-generated method stub
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void save() {
// 学生只有一个老师,老师可以有多个学生
Teacher teacher1 = new Teacher();
teacher1.setTname("李新");
session.save(teacher1);
Teacher teacher2 = new Teacher();
teacher2.setTname("王磊");
session.save(teacher2);
Student student1 = new Student();
student1.setSname("张三");
session.save(student1);
Student student2 = new Student();
student2.setSname("孙莹");
session.save(student2);
Student student3 = new Student();
student3.setSname("关玄");
session.save(student3);
// 把学生添加到老师对象里,这样子就构成了双端了
HashSet<Student> students1 = new HashSet<Student>();
students1.add(student1);
students1.add(student2);
teacher1.setStudents(students1);
HashSet<Student> students2 = new HashSet<Student>();
students2.add(student3);
teacher2.setStudents(students2);
}
@Test
public void test() {
// 在单向多对一里面,就已经完成了基本的操作功能,为什么要双向多对一?
// 单向场景:已知student,想要知道学生对应的老师 案例(略)
// 双向场景:已知teacher,想要知道老师教的对应学生
Teacher teacher = session.get(Teacher.class, 1);
// 取出这个老师所教的所有学生
Set<Student> students = teacher.getStudents();
System.out.println(students.toString());
}
}
package com.hliedu.manytoone.two;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*Hibernate调用程序*/
public class HibernateUtil {
// Junit测试,单元测试
private static Configuration cfg = null;
private static SessionFactory sessionFactory = null;
static {
// 创建Configuration实例,读取默认hibernate配置文件
cfg = new Configuration().configure();
// 通过cfg创建一个SessionFactory工厂类,维护着2级缓存,不需要关闭
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
3、一对一主键关系映射
实战
目录结构
User实体类
package com.hliedu.onetoone;
public class User {
private Integer userId;
private String userName;
/***
* 双向第一步
*/
private UserExt userExt;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public UserExt getUserExt() {
return userExt;
}
public void setUserExt(UserExt userExt) {
this.userExt = userExt;
}
}
User.hbm.xml
UserExt实体类
package com.hliedu.onetoone;
public class UserExt {
// 即是本表的主键,也是另一个表的外键
private Integer userId;
private String idCardNo;
private String sex;
/***
* 第四步
*/
// 依赖于另外一个表,ext表是基于user这个主表产生的,ext主键id依赖于user主表
private User user;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getIdCardNo() {
return idCardNo;
}
public void setIdCardNo(String idCardNo) {
this.idCardNo = idCardNo;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return userId + " " + idCardNo + " " + sex;
}
}
UserExt.hbm.xml
hibernate.cfg.xml添加
测试类
4、一对一外键关联映射
实战
目录结构
User实体类
package com.hliedu.onetoone.more;
public class User {
private Integer userId;
private String userName;
/***
* 第三步,建立双向关系
*/
private UserExt userExt;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public UserExt getUserExt() {
return userExt;
}
public void setUserExt(UserExt userExt) {
this.userExt = userExt;
}
}
User.hbm.xml
UserExt实体类
package com.hliedu.onetoone.more;
public class UserExt {
// 即是本表的主键,也是另一个表的外键
private Integer userId;
private String idCardNo;
private String sex;
/***
* 第四步
*/
// 在拓展表中增加主表的属性
private User user;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getIdCardNo() {
return idCardNo;
}
public void setIdCardNo(String idCardNo) {
this.idCardNo = idCardNo;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return userId + " " + idCardNo + " " + sex;
}
}
UserExt.hbm.xml
hibernate.cfg.xml添加
测试类
5、多对多单向关系映射配置
概念
实战
项目目录
Clazz实体类
package com.hliedu.manytomany.one;
import java.util.HashSet;
import java.util.Set;
public class Clazz {
private Integer classId;
private String className;
private Set<Teacher> teachers = new HashSet<Teacher>();
public Integer getClassId() {
return classId;
}
public void setClassId(Integer classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
Clazz.hbm.xml
Teacher实体类
package com.hliedu.manytomany.one;
public class Teacher {
private Integer teacherId;
private String teacherName;
public Integer getTeacherId() {
return teacherId;
}
public void setTeacherId(Integer teacherId) {
this.teacherId = teacherId;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
}
Teacher.hbm.xml
hibernate.cfg.xml添加
测试类
6、多对多双向关系映射配置
目录一样
Clazz.hbm.xml
Teacher.hbm.xml
hibernate.cfg.xml添加
测试类
7、组件映射配置
Car实体类
Wheel实体类
新建Car.hbm.xml
hibernate.cfg.xml添加
测试类