开始之间说两句:
这个student对course是多对多的关系,多对多关联映射有两种情况:第一种情况,<many-to-many>
的情况,生成第三个表,但是第三个表没有实际效用,故而没有第三个实际存在的类。第二种情况,多对多关联映射拆分为<many-to-one><one-to-many>
的情况,也就是我们现在说的这种情况,sc表有效用,需要用到sc表,所以需要创建Sc.java
,。
1.那么我们开始新建工程吧。工程目录如下:
2.确认映射关系
3.编写java文件
/*************Course.java*****************/
package com.feng.dao;
import java.util.HashSet;
import java.util.Set;
public class Course {
private Integer cno;
private String cname;
private Set<Student> students =new HashSet<Student>(0);
public Integer getCno() {
return cno;
}
public void setCno(Integer cno) {
this.cno = cno;
}
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;
}
}
/***************Sc.java******************/
package com.feng.dao;
public class Sc {
private Integer grade;
private Student student;
private Course course;
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
}
/*************Student.java********************/
package com.feng.dao;
import java.util.HashSet;
import java.util.Set;
public class Student {
private Integer sno;
private String sname;
private String ssex;
private Set<Course> courses=new HashSet<Course>(0);
public Integer getSno() {
return sno;
}
public void setSno(Integer sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
4.创建数据库表
5.创建hibernatejava
类同数据库table的映射文件student.hbm.xml
,course.hbm.xml
,sc.hbm.xml
,分别依次如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.feng.dao">
<class name="Student" table="student">
<id name="sno">
<column name="sno" sql-type="int"></column>
<generator class="increment" ></generator>
</id>
<property name="sname" type="java.lang.String" column="sname"/>
<property name="ssex" type="java.lang.String" column="ssex"></property>
<!-- 实现了对sc表中的映射 -->
<set name ="courses" cascade="all" table="sc">
<key column="cno"></key>
<one-to-many class="Course"></one-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.feng.dao">
<class name="Course" table="course">
<id name="cno">
<column name="cno" sql-type="int"></column>
<generator class="increment" ></generator>
</id>
<property name="cname" type="java.lang.String" column="cname"/>
<set name ="students" cascade="all" table="sc">
<key column="sno"></key>
<one-to-many class="Student"></one-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.feng.dao">
<class name="Sc" table="sc">
<id name="grade">
<column name="grade" sql-type="int"></column>
</id>
<many-to-one name="student" class="Student" column="sno" cascade="all"></many-to-one>
<many-to-one name="course" class="Course" column="cno" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
6.创建工程对数据库的映射即hibernate.cfg.xml
文件
<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License:
GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the
lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. -->
<!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>
<!--mysql database -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/student</property>
<!-- student is your database. -->
<property name="connection.username">root</property>
<!-- Account is root. -->
<property name="connection.password"></property>
<!-- Password is null. -->
<property name="connection.characterEncoding">utf8</property>
<!-- Encoding is utf8. -->
<property name="connection.pool_siez">10</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- This represents the connection to the database. -->
<mapping resource="com/feng/dao/student.hbm.xml" />
<mapping resource="com/feng/dao/course.hbm.xml" />
<mapping resource="com/feng/dao/sc.hbm.xml" />
</session-factory>
</hibernate-configuration>
8.创建测试类,Test.java
package com.feng.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import com.feng.dao.Course;
import com.feng.dao.Sc;
import com.feng.dao.Student;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.进行配置文件的读取
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder();
StandardServiceRegistry sr = ssrb.configure().build();
// 2.由config得到一个会话工厂//得到sessionFactory
SessionFactory sf = new MetadataSources(sr).buildMetadata().buildSessionFactory();
// 3.由sessionFacatory得到session
Session session = sf.openSession();
/*
* 开启事务,增删改都需要事务
*/
Transaction tran = session.beginTransaction(); // 不但得到事务的对象而且还开启了,,还可以session.getTransaction().begin();
//
Student s =new Student();
s.setSname("lisi");
s.setSsex("women");
Course c =new Course();
c.setCname("China");
Sc sc =new Sc();
sc.setGrade(100);
s.getCourses().add(c);
c.getStudents().add(s);
sc.setCourse(c);
sc.setStudent(s);
session.save(sc);
tran.commit(); // 一定要提交事务!!!!!!!
// 4.记得关闭session
session.close();
sf.close();
}
}
9.执行成功
在sc、student、course表中各自插入了一条数据,这里就不再展示了
10.思考:此处就有一个疑问了,我在sc.hbm.xml文件中写的级联映射为all,那么,会不会删除sc表中的数据,同时student和course表中的数据同样删去了呢?来实现一下:
在Test.java
main函数中,
事务之间写入:
Sc sc =new Sc();
sc.setGrade(100);
session.delete(sc);
运行之后发现,sc表中删除了这条数据,但是student表和course表中没有删除数据,所以,在sc表中删除数据,不会影响student表和course表,这符合逻辑性。
学习不息,代码不止,加油!!!!