实现Hibernate关联映射
- 学生与身份证是一对一关联
- IdCard.java
package com.ydy.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
@Entity
@Table(name="card")
public class IdCard {
@Id
@GeneratedValue(generator="aa")
@GenericGenerator(name="aa",strategy="foreign",
parameters={@Parameter(name="property",value="person")})
private Integer id;
private String cardNo;
@OneToOne(mappedBy="card")
private Student student;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "IdCard [id=" + id + ", cardNo=" + cardNo + ", student=" + student + "]";
}
}
- Student.java
package com.ydy.entity;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import com.ydy.entity.IdCard;
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn(name="id")
private IdCard card;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getCard() {
return card;
}
public void setCard(IdCard card) {
this.card = card;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", card=" + card + "]";
}
}
- IdCard.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ydy.entity">
<class name="IdCard" table="card" >
<id name="id" column="id" >
<generator class="foreign">
<param name="property">student</param>
</generator>
</id>
<property name="cardNo" column="cardNo" />
<one-to-one name="student" class="Student" constrained="true"/>
</class>
</hibernate-mapping>
- Student.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ydy.entity">
<class name="Student" table="student_card" >
<id name="id" column="id" >
<generator class="native">
</generator>
</id>
<property name="name" column="name" />
<one-to-one name="card" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
- TestYdy.java
package com.ydy.ui;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.ydy.entity.IdCard;
import com.ydy.entity.Student;
import com.ydy.util.HibernateUtil;
public class TestYdy {
/**
* 12.12 测试类(主键关联)--->主要测试程序功能实现情况
* 注意:<顺序>
* constrained="true"--->添加时先添加主表后添加从表,删除时反之。
*/
public TestYdy() {
}
public static void main(String[] args) {
// save();
update();
// delete();
}
/*
*
* 实现添加功能
*/
public static void save() {
Configuration cfg=new Configuration().configure();
SessionFactory factory=cfg.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Student s=new Student();
s.setName("张三");
IdCard card=new IdCard();
card.setCardNo("0001");
card.setStudent(s);
s.setCard(card);
session.save(s);
session.save(card);
tran.commit();//提交
session.close();
factory.close();
}
/*
*
* 实现删除功能
*/
public static void delete() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtil.openSession();
tran = session.beginTransaction();
// ---------------------------------
// 查找Person对象
Student s = session.load(Student.class, 5);
System.out.println(s.getCard().getCardNo());
session.delete(s);
// ---------------------------------
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
/*
* 实现修改功能
*/
public static void update() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtil.openSession();
tran = session.beginTransaction();
// ---------------------------------
// 查找Person对象
Student s = session.load(Student.class, 1);
s.setName("李四");//级联更新,在修改name的同时修改idcard;
IdCard card=s.getCard();
card.setCardNo("0002");
s.setCard(card);
session.update(s);
// ---------------------------------
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
}
- HibernateUtil.java
package com.ydy.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
/**
* @Title: HibernateUtil.java
* @Package com.ydy.util
* @Description: 描述
* @author: 太平洋醋王
* @date: 2019年11月4日 下午12:17:21
*/
/**
* 初始化Hibernate过程
* Configuration、SessionFactory、Session对象
*/
public class HibernateUtil {
public HibernateUtil() {
// TODO Auto-generated constructor stub
}
// SessionFactory实例(会话工厂)
private static SessionFactory sessionFactory = null;
//Configuration configuration = new Configuration();
/**
* 静态初始化 Hibernate
*/
static {
// 1 创建 StandardServiceRegistry 实例(标准注册服务)
// 1.1 创建 StandardServiceRegistryBuilder 实例(标准注册服务生成器)
// 1.2 从 hibernate.cfg.xml 配置文件中读取配置信息
// 1.3 构建 StandardServiceRegistry实例(标准注册服务)
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
try {
// 2 创建 SessionFactory 实例(会话工厂)
// 2.1 根据标准注册服务创建一个 MetadataSources 实例(元数据资源集)
// 2.2 构建元数据
// 2.3 生成应用一般唯一的 SessionFactory 实例(会话工厂)
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
} catch (Exception e) {
// 2.4 创建失败手动释放 StandardServiceRegistry 实例
StandardServiceRegistryBuilder.destroy(registry);
e.printStackTrace();
}
}
/**
* 打开一个 Session 会话
* @return Session
*/
public static Session openSession() {
return sessionFactory.openSession();
}
}
- Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,
XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件-->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--Hibernate配置文件的根元素,其他文件要包含在其中-->
<hibernate-configuration>
<!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作-->
<session-factory>
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<!-- 连接数据库时数据的传输字符集编码方式 -->
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<!--连接数据库时的用户名-->
<property name="hibernate.connection.username">root</property>
<!--连接数据库时的密码-->
<property name="hibernate.connection.password">123456</property>
<!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,
程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化输出的Sql语句 -->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--指定映射文件,可映射多个映射文件-->
<!-- <mapping class="com.lll.entity.IdCard"/>
<mapping class="com.lll.entity.Student"/> -->
<mapping resource="com/lll/entity/IdCard.hbm.xml"/>
<mapping resource="com/lll/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 学生与角色是一对多关联
- Role.java
package com.ydd.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
@Entity
@Table(name="role")
public class Role {
private Integer id;//代理主键
private String name;
private Set<Student> students=new HashSet<Student>();//对应的员工的对象
public Role(){
}
public Role(Integer id, String name) {
this.id = id;
this.name = name;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(targetEntity=Student.class,mappedBy="role",cascade=CascadeType.ALL)
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Role [id=" + id + ", name=" + name + "]";
}
}
- Student.java
package com.ydd.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.Proxy;
//@Proxy(lazy=false)
@Entity
@Table(name="student")
public class Student {
private Integer id;
private String name;
private String telephone;
private Role role;
public Student(){
}
public Student(String name, String telephone) {
super();
this.name = name;
this.telephone = telephone;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="telephone")
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@ManyToOne
@JoinColumn(name="rid")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", telephone=" + telephone
+ "]";
}
}
- Role.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ydd.entity">
<class name="Role" table="role" >
<id name="id" column="id" >
<generator class="identity">
</generator>
</id>
<property name="name" column="name" >
<!-- <column name="" sql-type=""></column> -->
</property>
<!-- inverse="true" lazy="true" outer-join="true" fetch="subselect" -->
<set name="students" cascade="all" inverse="true">
<!--inverse属性是谁维护外键(关联关系),是否放弃维护权,false:当前方维护外键,true:由对方维护外键,inverse="true"意思是让多方维护外键 -->
<key column="rid"></key>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
- Student,hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ydd.entity">
<class name="Student" table="student" >
<id name="id" column="id" >
<generator class="identity">
</generator>
</id>
<property name="name" column="name" />
<property name="telephone" column="telephone"></property>
<many-to-one name="role" column="rid" class="Role" outer-join="false" fetch="join"></many-to-one>
<!-- many-to-one不提供inverse属性,默认是false;不能设置 -->
</class>
</hibernate-mapping>
-
TestYdd.java
-
HibernateUtil.java
package com.ydd.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
/**
* 初始化Hibernate过程
* Configuration、SessionFactory、Session对象
*/
public class HibernateUtil {
public HibernateUtil() {
// TODO Auto-generated constructor stub
}
// SessionFactory实例(会话工厂)
private static SessionFactory sessionFactory = null;
//Configuration configuration = new Configuration();
/**
* 静态初始化 Hibernate
*/
static {
// 1 创建 StandardServiceRegistry 实例(标准注册服务)
// 1.1 创建 StandardServiceRegistryBuilder 实例(标准注册服务生成器)
// 1.2 从 hibernate.cfg.xml 配置文件中读取配置信息
// 1.3 构建 StandardServiceRegistry实例(标准注册服务)
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
try {
// 2 创建 SessionFactory 实例(会话工厂)
// 2.1 根据标准注册服务创建一个 MetadataSources 实例(元数据资源集)
// 2.2 构建元数据
// 2.3 生成应用一般唯一的 SessionFactory 实例(会话工厂)
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
} catch (Exception e) {
// 2.4 创建失败手动释放 StandardServiceRegistry 实例
StandardServiceRegistryBuilder.destroy(registry);
e.printStackTrace();
}
}
/**
* 打开一个 Session 会话
* @return Session
*/
public static Session openSession() {
return sessionFactory.openSession();
}
}
- Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,
XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件-->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--Hibernate配置文件的根元素,其他文件要包含在其中-->
<hibernate-configuration>
<!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作-->
<session-factory>
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<!-- 连接数据库时数据的传输字符集编码方式 -->
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<!--连接数据库时的用户名-->
<property name="hibernate.connection.username">root</property>
<!--连接数据库时的密码-->
<property name="hibernate.connection.password">123456</property>
<!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,
程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化输出的Sql语句 -->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--指定映射文件,可映射多个映射文件-->
<!-- <mapping class="com.ydd.entity.Role"/>
<mapping class="com.ydd.entity.Student"/> -->
<mapping resource="com/ydd/entity/Role.hbm.xml"/>
<mapping resource="com/ydd/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 学生与课程是多对多关联
- Course.java
package com.ddd.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="courses")
public class Course {
private Integer id;
private String name;
private Set<Student> students=new HashSet<Student>();
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(mappedBy="courses")
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + ", students=" + students + "]";
}
}
- Student.java
package com.ddd.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="students")
public class Student {
private Integer id;
private String name;
private Set<Course> courses=new HashSet<Course>();
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany
@JoinTable(name="students_course",joinColumns=@JoinColumn(name="sid")
,inverseJoinColumns=@JoinColumn(name="cid"))
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", courses=" + courses + "]";
}
}
-
Course.hbm.xml
-
Student,hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ddd.entity">
<class name="Student" table="m_student" >
<id name="id" column="id" >
<generator class="increment" />
</id>
<property name="name" column="name" />
<set name="courses" table="m_student_course" cascade="all">
<key column="sid"></key>
<many-to-many class="Course" column="cid" ></many-to-many>
</set>
</class>
</hibernate-mapping>
- TestDdd.java
package com.ddd.ui;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.ddd.util.HibernateUtil;
import com.ddd.entity.Course;
import com.ddd.entity.Student;
public class TestDdd {
/**
* 12.14 测试类--->主要测试程序功能实现情况
*
*/
public TestDdd() {
}
public static void main(String[] args) {
save();
//update();
// delete();
//find();
}
public static void find() {
Configuration cfg=new Configuration().configure();
SessionFactory factory=cfg.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Student student=session.get(Student.class, 1);
System.out.println("当前用户是"+student.getName());
Set<Course> courses=student.getCourses();
for(Course course:courses){
System.out.println(course.getName());
}
tran.commit();
session.close();
factory.close();
}
/*
*
* 实现添加功能
*/
public static void save() {
Configuration cfg=new Configuration().configure();
SessionFactory factory=cfg.buildSessionFactory();
Session session=factory.openSession();
Transaction tran=session.beginTransaction();
Student student1=new Student();
student1.setName("小明");
Student student2=new Student();
student2.setName("小红");
Course course1=new Course();
course1.setName("JAVA");
Course course2=new Course();
course2.setName("C++");
//建立关联
student1.getCourses().add(course1);//由用户来维护关联,所以用户在前面
student1.getCourses().add(course2);
// role1.getStudent().add(student1);
// role2.getStudent().add(student1);
student2.getCourses().add(course1);
// role1.getStudent().add(student2);
session.save(student1);
session.save(student2);
session.save(course1);
session.save(course1);
tran.commit();
session.close();
factory.close();
}
/*
*
* 实现删除功能
*/
public static void delete() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtil.openSession();
tran = session.beginTransaction();
// ---------------------------------
// 查找Person对象
Student student = session.load(Student.class, 2);
System.out.println(student.getName());
session.delete(student);
// ---------------------------------
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
/*
* 实现修改功能
*/
public static void update() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtil.openSession();
tran = session.beginTransaction();
// ---------------------------------
// 查找Person对象
Student student = session.load(Student.class, 5);
student.setName("zhangsan");
session.update(student);
// ---------------------------------
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
}
- HibernateUtil.java
package com.ddd.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
/**
* 初始化Hibernate过程
* Configuration、SessionFactory、Session对象
*/
public class HibernateUtil {
public HibernateUtil() {
// TODO Auto-generated constructor stub
}
// SessionFactory实例(会话工厂)
private static SessionFactory sessionFactory = null;
//Configuration configuration = new Configuration();
/**
* 静态初始化 Hibernate
*/
static {
// 1 创建 StandardServiceRegistry 实例(标准注册服务)
// 1.1 创建 StandardServiceRegistryBuilder 实例(标准注册服务生成器)
// 1.2 从 hibernate.cfg.xml 配置文件中读取配置信息
// 1.3 构建 StandardServiceRegistry实例(标准注册服务)
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
try {
// 2 创建 SessionFactory 实例(会话工厂)
// 2.1 根据标准注册服务创建一个 MetadataSources 实例(元数据资源集)
// 2.2 构建元数据
// 2.3 生成应用一般唯一的 SessionFactory 实例(会话工厂)
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
} catch (Exception e) {
// 2.4 创建失败手动释放 StandardServiceRegistry 实例
StandardServiceRegistryBuilder.destroy(registry);
e.printStackTrace();
}
}
/**
* 打开一个 Session 会话
* @return Session
*/
public static Session openSession() {
return sessionFactory.openSession();
}
}
- Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,
XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件-->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--Hibernate配置文件的根元素,其他文件要包含在其中-->
<hibernate-configuration>
<!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作-->
<session-factory>
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<!-- 连接数据库时数据的传输字符集编码方式 -->
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<!--连接数据库时的用户名-->
<property name="hibernate.connection.username">root</property>
<!--连接数据库时的密码-->
<property name="hibernate.connection.password">123456</property>
<!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,
程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化输出的Sql语句 -->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--指定映射文件,可映射多个映射文件-->
<!-- <mapping class="com.ydy.entity.Course"/>
<mapping class="com.ydy.entity.Student"/> -->
<mapping resource="com/ddd/entity/Course.hbm.xml"/>
<mapping resource="com/ddd/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>