编写代码实现Hibernate关联映射。 学生与学生学号是一对一关联;学生与角色是一对多关联;学生与课程是多对多关联。
下面是代码:
one to one
package com.entity;
public class Student {
private Integer id;
private String name;
private StudentId studentid;
public Student() {
}
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 StudentId getStudentid() {
return studentid;
}
public void setStudentid(StudentId studentid) {
this.studentid = studentid;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", studentid=" + studentid + "]";
}
}
package com.entity;
public class StudentId {
private Integer id;
private String idNo;
private Student student;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getIdNo() {
return idNo;
}
public void setIdNo(String idNo) {
this.idNo = idNo;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "StudentId [id=" + id + ", idNo=" + idNo + ", student=" + student + "]";
}
}
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity">
<class name="Student" table="student">
<id name="id" column="id">
<generator class="native">
<param name="native"></param>
</generator>
</id>
<property name="name" column="name"></property>
<one-to-one name="studentid" class="StudentId" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity">
<class name="StudentId" table="studentid">
<id name="id" column="id">
<generator class="foreign">
<param name="property">student</param>
</generator>
</id>
<property name="idNo" column="idNo"></property>
<one-to-one name="student" class="Student" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
测试类
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity.Student;
import com.entity.StudentId;
import com.util.HibernateUtil;
import com.util.HibernateUtils;
public class OtOTest {
public static void main(String[] args) {
// save();
//delete();
//update();
find();
}
private static void save() {
Configuration configuration = new Configuration();
configuration.configure();
SessionFactory factory = configuration.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Student s1=new Student();
s1.setName("我");
StudentId sid=new StudentId();
sid.setIdNo("2222");
sid.setStudent(s1);
s1.setStudentid(sid);
session.save(s1);
tran.commit();
session.close();
factory.close();
}
private static void delete() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
Student student = session.get(Student.class, 7);
session.delete(student);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
private static void update() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
// 查找Student对象
Student student = session.load(Student.class, 6);
student.setName("小红");
StudentId studentid = student.getStudentid();
studentid.setIdNo("0002");
session.update(student);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
private static void find() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
Student student = session.load(Student.class, 13);
System.out.println(student.getName());
StudentId studentid = student.getStudentid();
System.out.println(studentid.getIdNo());
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
}
one to many
package com.entity2;
import java.util.HashSet;
import java.util.Set;
public class Student {
private Integer id;
private String name;
private Set<Role> roles=new HashSet<Role>();
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 Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Student [roles=" + roles + "]";
}
}
package com.entity2;
public class Role {
private Integer id;
private String name;
private Student student;
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 Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Role [id=" + id + ", name=" + name + ", student=" + student + "]";
}
}
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity2">
<class name="Student" table="student2" >
<id name="id" column="id" >
<generator class="identity">
</generator>
</id>
<property name="name" column="name" >
<!-- <column name="" sql-type=""></column> -->
</property>
<!--inverse属性是谁维护外键,维护关联关系,是否放弃维护权;false表示当前方维护外键 -->
<!-- <set name="employees" inverse="true" lazy="true" outer-join="true" fetch="subselect">-->
<set name="roles" cascade="all" inverse="true">
<key column="did"></key>
<one-to-many class="Role"/>
</set>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity2">
<class name="Role" table="role" >
<id name="id" column="id" >
<generator class="identity">
</generator>
</id>
<property name="name" column="name" />
<!-- many-to-one不提供inverse属性 -->
<many-to-one name="student" column="did" class="Student"></many-to-one>
</class>
</hibernate-mapping>
测试类
package com.test;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity2.Student;
import com.entity2.Role;
import com.util.HibernateUtil;
import com.util.HibernateUtils;
public class OtmTest {
public static void main(String[] args) {
// save();
//delete();
// update();
find();
}
private static void save() {
Configuration configuration = new Configuration();
configuration.configure();
SessionFactory factory = configuration.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Student s1=new Student();
s1.setName("xiaohong");
Role role1 = new Role();
role1.setName("大学生");
role1.setStudent(s1);
Role role2 = new Role();
role2.setName("小学生");
role2.setStudent(s1);
s1.getRoles().add(role1);
s1.getRoles().add(role2);
session.save(s1);
tran.commit();
session.close();
factory.close();
}
private static void delete() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
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();
}
}
}
private static void update() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
// 查找Student对象
Student student = session.load(Student.class, 3);
student.setName("dapeng");
// Role load = session.load(Role.class, 5);
// Role load2 = session.load(Role.class, 6);
// load.setName("学生");
// load2.setName("学生");
session.update(student);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
private static void find() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
// 查找Student对象
Student student = session.load(Student.class, 3);
System.out.println("当前用户是"+student.getName());
Set<Role> roles =student.getRoles();
for(Role role:roles){
System.out.println(role.getName());
}
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
}
many to many
package com.entity3;
import java.util.HashSet;
import java.util.Set;
public class Student {
private Integer id;
private String name;
private Set<Course> courses =new HashSet<Course>();
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 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 + "]";
}
}
package com.entity3;
import java.util.HashSet;
import java.util.Set;
public class Course {
private Integer id;
private String name;
private Set<Student> students=new HashSet<Student>();
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 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 + "]";
}
}
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity3">
<class name="Student" table="student3" >
<id name="id" column="id" >
<generator class="increment" />
</id>
<property name="name" column="name" />
<set name="courses" table="students_courses" >
<key column="studentid"></key>
<many-to-many class="Course" column="courseid" ></many-to-many>
</set>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.entity3">
<class name="Course" table="courses" >
<id name="id" column="id" >
<generator class="increment" />
</id>
<property name="name" column="name" />
<set name="students" table="students_courses" inverse="true">
<key column="courseid"></key>
<many-to-many class="Student" column="studentid" ></many-to-many>
</set>
</class>
</hibernate-mapping>
测试类
package com.test;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity3.Student;
import com.entity3.Course;
import com.util.HibernateUtil;
import com.util.HibernateUtils;
public class MtmTest {
public static void main(String[] args) {
//save();
//delete();
// update();
find();
}
private static void save() {
Configuration configuration = new Configuration();
configuration.configure();
SessionFactory factory = configuration.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Student s1 = new Student();
Student s2 = new Student();
s1.setName("绿");
s2.setName("红");
Course c1 = new Course();
Course c2 = new Course();
c1.setName("语");
c2.setName("数");
//建立关联
s1.getCourses().add(c1);
s1.getCourses().add(c2);
s2.getCourses().add(c1);
s2.getCourses().add(c2);
session.save(s1);
session.save(s2);
session.save(c1);
session.save(c2);
tran.commit();
session.close();
factory.close();
}
private static void delete() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
// 查找Student对象
Student student = session.get(Student.class, 3);
System.out.println(student.getName());
session.delete(student);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
private static void update() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
// 查找Student对象
// Student student = session.load(Student.class, 4);
Course course = session.load(Course.class, 6);
course.setName("english");
// student.setName("改改");
// session.update(student);
session.update(course);
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
private static void find() {
Session session = null;
Transaction tran = null;
try {
session = HibernateUtils.getSession();
tran = session.beginTransaction();
// 查找Student对象
Student student = session.load(Student.class, 4);
System.out.println("这个学生是"+student.getName());
Set<Course> courses = student.getCourses();
for(Course course:courses){
System.out.println(course.getName());
}
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if (null != session) {
session.close();
}
}
}
}
通用工具类
package com.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
//封装工具类
public class HibernateUtils {
private static Configuration cfg;
private static SessionFactory factory;
private static Session session;
static{
cfg=new Configuration().configure();
factory=cfg.buildSessionFactory();
}
//获取SessionFactory对象
public static SessionFactory getSessionFactory(){
return factory;
}
//获取Session对象
public static Session getSession(){
session=factory.openSession();
return session;
}
public static void closeSession(Session session){
if(null != session){
session.close();
}
}
}
package com.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;
import org.hibernate.cfg.Configuration;
/**
* 3.27
* 初始化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();
// }
public static Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
核心配置文件
<?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?characterEncoding=UTF-8</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 resource="com/entity/StudentId.hbm.xml"/>
<mapping resource="com/entity/Studentoto.hbm.xml"/>
<mapping resource="com/entity2/Studentotm.hbm.xml"/>
<mapping resource="com/entity2/Role.hbm.xml"/>
<mapping resource="com/entity3/Studentmtm.hbm.xml"/>
<mapping resource="com/entity3/Coursemtm.hbm.xml"/>
</session-factory>
</hibernate-configuration>