Hibernate_基于Annotation的使用_ManyToOne_Demo(mappedBy="person")

<pre name="code" class="java"><span style="color:#FF0000;">不维护关系那方@OneToMany(mappedBy="person"):在不维护关系那方添加这个Annotation;由我在对方的属性(字段)来维护。</span>
<span style="color:#FF0000;">@OneToMany(mappedBy="cla")//mappedBy="cla"让多的一方的cla属性来维护关系</span>



<!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><!-- hibernate的方言,用来确定连接的数据库 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 数据库的连接类 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- 数据的连接字符串和用户名密码 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/itat_hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123</property><!-- 在使用hibernate时会显示SQL --><property name="show_sql">true</property><!-- 会自动完成类到数据表的转换 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 加入实体类的映射文件 --><mapping class="org.com.test.model.User"/><mapping class="org.com.test.model.Student"/><mapping class="org.com.test.model.Classroom"/></session-factory></hibernate-configuration>
 

package org.com.test.model;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name="t_classroom")
public class Classroom {
	private int id ;
	private String name;
	private Set<Student> students;
	
	@OneToMany(mappedBy="cla")//mappedBy="cla"让多的一方的cla属性来维护关系
	@LazyCollection(LazyCollectionOption.EXTRA)//让在Classroom中取students集合的大小的时候使用Count
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}

package org.com.test.model;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="t_student")
public class Student {
	private int id ;
	private String name ;
	private int no;
	private Classroom cla;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	@ManyToOne(fetch=FetchType.LAZY)//让延迟加载恢复作用。
	@JoinColumn(name="c_id")//把默认的关联列的名称改成c_id;
	public Classroom getCla() {
		return cla;
	}
	public void setCla(Classroom cla) {
		this.cla = cla;
	}
	
	
}

package org.com.test.test;

import org.com.test.model.Classroom;
import org.com.test.model.Student;
import org.com.test.util.HibernateUtil;
import org.hibernate.Session;
import org.junit.Test;

public class TestManyToOne {

	@Test
	public void testAdd(){
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			session.beginTransaction();
			
			Classroom c = new Classroom();
			c.setName("网络技术班1");
			Student s = new Student();
			Student s1 = new Student();
			s.setName("张三1");
			s.setNo(12);
			s.setCla(c);
			s1.setName("李四1");
			s1.setNo(13);
			s1.setCla(c);
			session.save(s);
			session.save(s1);
			/**
			 * Hibernate: insert into t_student (name, no, c_id) values (?, ?, ?)
				Hibernate: insert into t_student (name, no, c_id) values (?, ?, ?)
				Hibernate: insert into t_classroom (name) values (?)
				Hibernate: update t_student set name=?, no=?, c_id=? where id=?
				Hibernate: update t_student set name=?, no=?, c_id=? where id=?
			 */
			session.save(c);//如果后面才添加classroom则发五条SQL;三条插入,两条更新
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(session);
		}
	}
	
	
	@Test
	public void testLoad(){
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			session.beginTransaction();
			
			Student s = (Student)session.load(Student.class, 1);//延迟加载,此时对象s只是代理对象,只有一个id;
			//System.out.println(s.getName());//使用s的id意外的数据的时候才发sql取数据。
			/**
			 * 此时取Student关联对象Classroom的时候也是延迟加载的,会再发一条sql取Classroom对象。
			 */
			System.out.println(s.getCla().getName());
			session.getTransaction().commit();
		} finally{
			HibernateUtil.closeSession(session);
		}
	}

	@Test
	public void testLoad2(){
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			session.beginTransaction();
			Classroom c = (Classroom)session.load(Classroom.class, 1);
			System.out.println(c.getStudents().size());
			session.getTransaction().commit();
		} finally{
			HibernateUtil.closeSession(session);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值