拿来的表为班级表1---n学生表,在这次的测试主键我用的是序列,创建代码如下:
- drop table classes;
- create table classes(
- cid int primary key,
- cname varchar2(50)
- );
- drop sequence seq_classes_cid;
- create sequence seq_classes_cid
- START WITH 1000 -- 从1000开始计数
- INCREMENT BY 1 -- 每次加1个
- --学生表
- drop table student;
- create table student(
- sid int primary key,
- sname varchar2(50),
- cid int constraint FK_student_cid references classes(cid)
- );
- drop sequence seq_student_sId;
- create sequence seq_student_sId
- START WITH 1000 -- 从1000开始计数
- INCREMENT BY 1 -- 每次加1个
cfg文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="connection.username">hibernate</property>
- <property name="connection.password">a</property>
- <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
- <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
- <!-- 方言 -->
- <property name="dialect">org.hibernate.dialect.OracleDialect</property>
- <!-- 是否在运行的时候显示sql语句 -->
- <property name="show_sql">true</property>
- <!-- 显示的sql语句是否进行排版 -->
- <property name="format_sql">true</property>
- <!-- 表结构生成策略 -->
- <property name="hbm2ddl.auto">update</property>
- <!-- getCurrentSession所需的参数(本地事务) -->
- <property name="hibernate.current_session_context_class">thread</property>
- </session-factory>
- </hibernate-configuration>
学生和班级实体类
- package com.yc.entity;
- import java.io.Serializable;
- public class Student implements Serializable{
- private static final long serialVersionUID = 3914237588346266940L;
- private int sid;
- private String sname;
- public Student() {
- }
- public Student(String sname) {
- this.sname = sname;
- }
- public Student(int sid, String sname) {
- this.sid = sid;
- this.sname = sname;
- }
- 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 toString() {
- return "Student [sid=" + sid + ", sname=" + sname + "]";
- }
- }
- package com.yc.entity;
- import java.io.Serializable;
- import java.util.HashSet;
- import java.util.Set;
- public class Classes implements Serializable {
- private static final long serialVersionUID = 948637569053708320L;
- private int cid;
- private String cname;
- //在一方定义一个多方的集合 一对多
- private Set<Student> students=new HashSet<Student>();
- public Classes() {
- }
- public Classes(String cname) {
- this.cname = cname;
- }
- public Classes(int cid, String cname, Set<Student> students) {
- this.cid = cid;
- this.cname = cname;
- this.students = students;
- }
- public int getCid() {
- return cid;
- }
- public void setCid(int cid) {
- this.cid = cid;
- }
- public String getCname() {
- return cname;
- }
- public void setCname(String cname) {
- this.cname = cname;
- }
- public Set<Student> getStudents() {
- return students;
- }
- public void setStudents(Set<Student> students) {
- this.students = students;
- }
- public String toString() {
- return "Classes [cid=" + cid + ", cname=" + cname + ", students="
- + students + "]";
- }
- }
根据实体类创建对应的hbm文件
Student.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 2016-8-12 19:33:30 by Hibernate Tools 3.4.0.CR1 -->
- <hibernate-mapping>
- <class name="com.yc.entity.Student" table="STUDENT">
- <id name="sid" type="int">
- <column name="SID" />
- <generator class="sequence" >
- <param name="sequence">seq_student_sId</param>
- </generator>
- </id>
- <property name="sname" type="java.lang.String">
- <column name="SNAME" />
- </property>
- </class>
- </hibernate-mapping>
- <?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 2016-8-12 19:33:30 by Hibernate Tools 3.4.0.CR1 -->
- <hibernate-mapping>
- <class name="com.yc.entity.Classes" table="CLASSES">
- <id name="cid" type="int">
- <column name="CID" />
- <generator class="sequence" >
- <param name="sequence">seq_classes_cid</param>
- </generator>
- </id>
- <property name="cname" type="java.lang.String">
- <column name="CNAME" />
- </property>
- <!-- 配置单向的一对多关联关系 -->
- <set name="students" table="STUDENT" inverse="false" lazy="true">
- <!-- 指定关联的外键列 -->
- <key>
- <column name="CID" />
- </key>
- <one-to-many class="com.yc.entity.Student" />
- </set>
- </class>
- </hibernate-mapping>
在cfg文件中加入映射路径
- <!-- 测试一对多 -->
- <mapping resource="Classes.hbm.xml" />
- <mapping resource="Student.hbm.xml" />
编写测试类测试
- package com.yc.test;
- import java.util.Collections;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.junit.Test;
- import com.yc.entity.Classes;
- import com.yc.entity.Student;
- import com.yc.utils.HibernateUtil;
- public class MyTest {
- @Test
- //插入数据的测试
- public void testAdd() {
- Classes c=new Classes("理工");
- Student s1=new Student("张三");
- Student s2=new Student("李四");
- //如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
- Collections.addAll(c.getStudents(), s1,s2);
- Session session=HibernateUtil.getSession();
- Transaction transaction=session.beginTransaction();
- session.save(c);
- session.save(s1);
- session.save(s2);
- transaction.commit();
- HibernateUtil.closeSession(session);
- }
- @Test
- //查询班级中包含的学生
- public void testFind() {
- Session session=HibernateUtil.getSession();
- Classes c=(Classes) session.get(Classes.class, 1000);
- //建立关联关系后,可以方便的从一个对象导航到另一个对象
- System.out.println(c);
- }
- @Test
- //修改学生信息
- public void testUpdate() {
- Classes c=new Classes("小淘气");
- Session session=HibernateUtil.getSession();
- Transaction transaction=session.beginTransaction();
- Student s=(Student) session.get(Student.class, 1001);
- c.getStudents().add(s);
- session.save(c);
- transaction.commit();
- HibernateUtil.closeSession(session);
- }
- @Test
- //删除
- public void testDelete() {
- Session session=HibernateUtil.getSession();
- Transaction transaction=session.beginTransaction();
- Student s=(Student) session.get(Student.class, 1000);
- session.delete(s);
- transaction.commit();
- HibernateUtil.closeSession(session);
- }
- }
测试结果,testAdd方法的测试结果
结束。