hibernate双边的多对一、一对多关系

本文整理了网上的一个学生和班级的关系讲解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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值