hibernate开发实例
环境搭建
jar包
在这里插入图片描述
本文使用hibernate4.2.21,导入其中的required文件夹中的jar包
核心配置文件
<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate配置文件的DTD信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,hibernate连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/sql_test</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">123456</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 根据需要自动创建数据表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有的映射文件 -->
<mapping resource="cn/edu/sicau/domain/User.hbm.xml"/>
<mapping resource="cn/edu/sicau/domain/Role.hbm.xml"/>
<mapping resource="cn/edu/sicau/domain/Teacher.hbm.xml"/>
<mapping resource="cn/edu/sicau/domain/School.hbm.xml"/>
</session-factory>
</hibernate-configuration>
一对多关系配置
这里以学校(school)和老师(teacher)多为一对多关系案例配置。
School.java
public class School {
private int sid;
private String sname;
private String address;
private Set<Teacher> teacherSet=new HashSet<>();
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Set<Teacher> getTeacherSet() {
return teacherSet;
}
public void setTeacherSet(Set<Teacher> teacherHashSet) {
this.teacherSet = teacherHashSet;
}
}
Teacher.java
public class Teacher {
private int tid;
private String tname;
private int tage;
private School school;
public int getTid() {
return tid;
}
public void setTid(int tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public int getTage() {
return tage;
}
public void setTage(int tage) {
this.tage = tage;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
}
School.hbm.xml
在学校对应的配置文件中,学校是一对多中的一方,使用< set />来配置,具体内容查看配置文件内容。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.edu.sicau.domain.School" table="school">
<!--学校id-->
<id name="sid">
<generator class="native"></generator>
</id>
<property name="sname"/>
<property name="address"/>
<!--学校与老师是一对多
set中的name为school中teacher集合对象名称
key column 对应的是school与teacher共同维护的外键的名称
-->
<set name="teacherSet" cascade="save-update">
<key column="tsid"></key>
<one-to-many class="cn.edu.sicau.domain.Teacher"/>
</set>
</class>
</hibernate-mapping>
Teacher.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.edu.sicau.domain.Teacher" table="teacher">
<id name="tid">
<generator class="native"></generator>
</id>
<property name="tname"/>
<property name="tage"/>
<!--
name 对应School对象的名称
column="tsid" 为学校与老师两张表共同维护的外键名称
-->
<many-to-one name="school" class="cn.edu.sicau.domain.School" column="tsid"/>
</class>
</hibernate-mapping>
测试类 test.java
public class test {
/**
* shcool-teacher 一对多
*/
@Test
public void oneToManyAdd(){
//SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
School school=new School();
school.setSname("计算机学校");
school.setAddress("中国");
Teacher teacher1=new Teacher();
teacher1.setTname("张三");
teacher1.setTage(23);
Teacher teacher2=new Teacher();
teacher2.setTname("李四");
teacher2.setTage(25);
school.getTeacherSet().add(teacher1);
school.getTeacherSet().add(teacher2);
//添加
session.save(school);
//提交事务
transaction.commit();
}catch (Exception e){
//回滚事务
transaction.rollback();
e.printStackTrace();
}finally {
//关闭
session.close();
sessionFactory.close();
}
}
}
多对多关系配置
这里使用用户表(User)与角色表(Role)来举例,实体类已在HQL多表查询中给出。
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.edu.sicau.domain.User" table="user">
<id name="uid">
<generator class="native"></generator>
</id>
<property name="uname"/>
<property name="uage"/>
<property name="usex"/>
<!--
name="roleSet" 对应在User类中,角色集合对象的名称
table="user_role" User和Role表共同维护的第三张表的名称
key column="userid" User表在第三张表中对应的外键的名称
column="roleid" Role表在第三张表中对应的外键的名称
-->
<set name="roleSet" table="user_role">
<key column="userid"></key>
<many-to-many class="cn.edu.sicau.domain.Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.edu.sicau.domain.Role" table="role">
<id name="rid">
<generator class="native"></generator>
</id>
<property name="rname"/>
<property name="authority"/>
<!--
name="userSet" 对应在User类中,角色集合对象的名称
table="user_role" User和Role表共同维护的第三张表的名称
key column="roleid" Role表在第三张表中对应的外键的名称
column="userid" User表在第三张表中对应的外键的名称
-->
<set name="userSet" table="user_role" cascade="save-update">
<key column="roleid"></key>
<many-to-many class="cn.edu.sicau.domain.User" column="userid"/>
</set>
</class>
</hibernate-mapping>
测试类test.java
public class test {
/**
* user-role 多对多
*/
@Test
public void ManyToOneAdd(){
//SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
User user1=new User();
user1.setUname("张三");
user1.setUsex("男");
user1.setUage(23);
User user2=new User();
user2.setUname("李四");
user2.setUsex("女");
user2.setUage(20);
User user3=new User();
user3.setUname("王五");
user3.setUsex("男");
user3.setUage(25);
Role role1=new Role();
role1.setRname("管理员");
role1.setAuthority(0);
Role role2=new Role();
role2.setRname("用户");
role2.setAuthority(1);
Role role3=new Role();
role3.setRname("游客");
role3.setAuthority(2);
role1.getUserSet().add(user1);
role1.getUserSet().add(user2);
role2.getUserSet().add(user2);
role2.getUserSet().add(user3);
role3.getUserSet().add(user1);
role3.getUserSet().add(user3);
session.save(role1);
session.save(role2);
session.save(role3);
transaction.commit();
}catch (Exception e){
transaction.rollback();
e.printStackTrace();
}finally {
session.close();
sessionFactory.close();
}
}
}