本文整理了网上的一个学生和班级的关系讲解hibernate中的双边关系。在多方(本例中为学生)有一方(本例中为班级)的引用,一方中也有多方的引用。
1、建立java工程
2、导入hibernate和MySql相关类库。
详见之前的博客hibernate单边一对多关系中的配置。
3、建立实体类
班级类为clazz.java,代码如下:
package com.arvinfei.hibernate2.bean;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
@Table(name = "tb_class")
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
//mappedBy属性该list对应student类中的clazz属性。
@OneToMany(mappedBy = "clazz")
@Cascade(value = CascadeType.DELETE_ORPHAN)
private List<Student> students = new ArrayList<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 List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
Student.java类为学生的实体类,代码如下:
package com.arvinfei.hibernate2.bean;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "tb_student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST })
@JoinColumn(name = "class_id")
private Clazz clazz;
private String name;
private String sex;
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
在双边关系中,控制权一般交由多方处理。
4、在hibernate的配置文件中添加实体类映射关系
hibernate.cfg.xml中配置如下:
<?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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/hibernate2?characterEncoding=UTF-8
</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<!-- 要加这一句 否则可能会遇到异常 -->
<property name="current_session_context_class">thread</property>
<!-- 添加实体类的映射关系 -->
<mapping class="com.arvinfei.hibernate2.bean.Clazz" />
<mapping class="com.arvinfei.hibernate2.bean.Student" />
</session-factory>
</hibernate-configuration>
5、新建测试代码
新建ClazzStudentTest.java文件用于测试。代码如下:
package com.arvinfei.hibernate2.test;
import java.util.List;
import org.hibernate.Session;
import com.arvinfei.hibernate2.bean.Clazz;
import com.arvinfei.hibernate2.bean.Student;
import com.arvinfei.hibernate2.sessionFactory.HibernateSessionFactory;
public class ClazzStudentTest {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
Clazz clazz = new Clazz();
clazz.setName("三年二班");
Student student1 = new Student();
student1.setName("周周");
student1.setSex("男");
Student student2 = new Student();
student2.setName("李四");
student2.setSex("女");
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
// 保存进数据库
session.persist(clazz);
session.persist(student1);
session.persist(student2);
// 设置班级
student1.setClazz(clazz);
student2.setClazz(clazz);
session.getTransaction().commit();
session.close();
session = HibernateSessionFactory.getSession();
session.beginTransaction();
// 查询名为“三年二班”的班级 然后输出学生
Clazz c = (Clazz) session.createQuery(
" select c from Clazz c where c.name = :name ").setParameter(
"name", "三年二班").uniqueResult();
System.out.println("三年二班 的所有学生:");
for (Student s : c.getStudents()) {
System.out.println("\t姓名:" + s.getName() + ", 性别:" + s.getSex());
}
// 直接查询班级为“三年二班”的学生
List<Student> students = session.createQuery(
" select s from Student s where s.clazz.name = :name ")
.setParameter("name", "三年二班").list();
System.out.println("三年二班 的所有学生:");
for (Student s : students) {
System.out.println("\t姓名:" + s.getName() + ", 性别:" + s.getSex());
}
session.getTransaction().commit();
session.close();
}
}
6、运行测试
(1)、新建数据库
使用如下命令创建一个hibernate2的数据库,指定编码格式为utf8编码
create database hibernate2 character set 'utf8';
(2)、以java工程的方式运行ClazzStudentTest.java。
7、代码下载
你可以从如下地址下载到本工程代码:
http://download.csdn.net/detail/yxtouch/9125535