hibernate.cfg.xml


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">q7231012</property>
<!--配置数据库方言,hibernate可以针对特殊的数据库进行优化-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--是否把hibernate运行时的sql语句输出到控制台-->
<property name="show_sql">true</property>
<!--sql语句输出之后是否进行排版-->
<property name="format_sql">true</property>
<!--可以帮助由Java代码生成数据库脚本,进而生成具体的表结构:
主要有四个属性:
1.create——先删除原有表,再新建表后插入数据
2.update——在原有表的基础上插入数据
3.create-drop——先创建再删除
4.validate——对原来的表进行验证(如果现在的表结构和原有的表结构不同,那么就不会创建表)-->
<property name="hbm2ddl.auto">update</property>

<!--默认的数据库表前缀-->
<property name="default_schema">hibernate</property>

<!--配置current session-->
<property name="hibernate.current_session_context_class">thread</property>

<mapping resource="entity/Students.hbm.xml"/>
<mapping class="entity.Students"/>
<mapping resource="entity/Grade.hbm.xml"/>
<mapping class="entity.Grade"/>
<mapping resource="entity/Student.hbm.xml"/>
<mapping class="entity.Student"/>


<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>


Student.java

package entity;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

/**
* Created by raid on 2016/5/15.
*/
@Entity
public class Student {
private Integer sid;
private String sname;
private String sex;
//在多方定义一个一方的引用
private Grade grade;

public Student() {
}

public Student(String sname, String sex) {
this.sname = sname;
this.sex = sex;
}

public Student(Integer sid, String sname, String sex) {
this.sid = sid;
this.sname = sname;
this.sex = sex;
}

@Id
@Column(name = "sid")
public Integer getSid() {
return sid;
}

public void setSid(Integer sid) {
this.sid = sid;
}

@Basic
@Column(name = "sname")
public String getSname() {
return sname;
}

public void setSname(String sname) {
this.sname = sname;
}

@Basic
@Column(name = "sex")
public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Grade getGrade() {
return grade;
}

public void setGrade(Grade grade) {
this.grade = grade;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Student student = (Student) o;

if (sid != null ? !sid.equals(student.sid) : student.sid != null) return false;
if (sname != null ? !sname.equals(student.sname) : student.sname != null) return false;
if (sex != null ? !sex.equals(student.sex) : student.sex != null) return false;

return true;
}

@Override
public int hashCode() {
int result = sid != null ? sid.hashCode() : 0;
result = 31 * result + (sname != null ? sname.hashCode() : 0);
result = 31 * result + (sex != null ? sex.hashCode() : 0);
return result;
}
}



Student.hbm.xml


<?xml version='1.0' encoding='utf-8'?>
<!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="entity.Student" table="student" schema="hibernate">
<id name="sid" column="sid">
<generator class="native"/>
</id>
<property name="sname" column="sname"/>
<property name="sex" column="sex"/>

<!--配置多对一的映射关系-->
<many-to-one name="grade" class="entity.Grade" column="gid" />

</class>

</hibernate-mapping>



Grade.java

package entity;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.HashSet;
import java.util.Set;

/**
* Created by raid on 2016/5/15.
*/
@Entity
public class Grade {
private Integer gid;
private String gname;
private String gdesc;

/*
一对多的关系,在一方定义多方的集合,可以使用Set和List集合
1.元素不允许重复就使用Set集合
2.允许重复使用List集合
*/
private Set<Student> students = new HashSet<>();

public Grade() {
}

public Grade(String gname, String gdesc) {
this.gname = gname;
this.gdesc = gdesc;
}

public Grade(Integer gid, String gname, String gdesc, Set<Student> students) {
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
this.students = students;
}

@Id
@Column(name = "gid")
public Integer getGid() {
return gid;
}

public void setGid(Integer gid) {
this.gid = gid;
}

@Basic
@Column(name = "gname")
public String getGname() {
return gname;
}

public void setGname(String gname) {
this.gname = gname;
}

@Basic
@Column(name = "gdesc")
public String getGdesc() {
return gdesc;
}

public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}

public Set<Student> getStudents() {
return students;
}

public void setStudents(Set<Student> students) {
this.students = students;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Grade grade = (Grade) o;

if (gid != null ? !gid.equals(grade.gid) : grade.gid != null) return false;
if (gname != null ? !gname.equals(grade.gname) : grade.gname != null) return false;
if (gdesc != null ? !gdesc.equals(grade.gdesc) : grade.gdesc != null) return false;

return true;
}

@Override
public int hashCode() {
int result = gid != null ? gid.hashCode() : 0;
result = 31 * result + (gname != null ? gname.hashCode() : 0);
result = 31 * result + (gdesc != null ? gdesc.hashCode() : 0);
return result;
}
}



Grade.hbm.xml


<?xml version='1.0' encoding='utf-8'?>
<!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="entity.Grade" table="grade" schema="hibernate">
<id name="gid" column="gid">
<generator class="native"/>
</id>
<property name="gname" column="gname"/>
<property name="gdesc" column="gdesc"/>
<!--配置单向的一对多关联关系, 设置inverse属性为true,表示由多方进行维护,一方不需要进行维护-->
<set name="students" table="student" inverse="true" cascade="save-update">
<!--指定关联的外键-->
<key column="gid" />
<one-to-many class="entity.Student" />
</set>
</class>
</hibernate-mapping>


Grade2StudentLogic.java

package dao;

import entity.Grade;
import entity.Student;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;

import java.util.Set;

/**
* Created by raid on 2016/5/15.
*/
public class Grade2StudentLogic {

public void add() {
Grade g = new Grade("计算机", "软件工程");
Student stu1 = new Student("小小黑", "男");
Student stu2 = new Student("raid", "女");
//如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);

Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(g);
session.save(stu1);
session.save(stu2);
transaction.commit();

}

public void findStudentsByGrade() {
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Grade grade = (Grade) session.get(Grade.class, 5);
System.out.println(grade.getGname() + "," + grade.getGdesc());

Set<Student> students = grade.getStudents();
for (Student stu : students) {
System.out.println(stu.getSname() + "," + stu.getSex());
}
transaction.commit();
}

public void update() {
Grade g = new Grade("计算机二", "软件工程二");
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Student stu = (Student) session.get(Student.class, 1);
g.getStudents().add(stu);
session.save(g);
transaction.commit();

}

public void delete() {
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Student stu = (Student) session.get(Student.class, 2);
session.delete(stu);
transaction.commit();

}


/**
* Created by raid on 2016/5/15.
* 单向多对一(学生->班级)
*/
public void save() {
Grade g = new Grade("Java三班", "Java软件开发三班");
Student stu1 = new Student("学生1", "女");
Student stu2 = new Student("学生2", "男");
//设置关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
stu1.setGrade(g);
stu2.setGrade(g);

Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(g);
// session.save(stu1);
// session.save(stu2);
transaction.commit();
}

public void findGradeByStudent() {
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Student stu = (Student) session.get(Student.class, 9);
System.out.println(stu.getSid() + "," + stu.getSname() + "," + stu.getSex());
Grade g = stu.getGrade();
System.out.println(g.getGid() + "," + g.getGname() + "," + g.getGdesc());
}

}



OneToManyTest.java

package dao;

/**
* Created by raid on 2016/5/15.
*/
public class OneToManyTest {

public static void main(String[] args) {
Grade2StudentLogic logic = new Grade2StudentLogic();
// logic.add();
// logic.findStudentsByGrade();
// logic.update();
logic.delete();
}

}


ManyToOneTest.java

package dao;

import entity.Grade;
import entity.Student;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;


public class ManyToOneTest {

public static void main(String[] args) {
Grade2StudentLogic logic = new Grade2StudentLogic();
// logic.save();
logic.findGradeByStudent();
}

}