Hibernate 一对多注解 实例

student:

/**
 *
 */
package com.wonders.task.sample.bo;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

/**
 * @ClassName: Student
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author zhoushun
 * @date 2014年2月27日 上午11:48:30
 *
 */

@Entity
@Table(name="Z_STUDENT")
public class Student {
	private String id;
	private String name;
	private Clazz clazz;

	@Id
	@GeneratedValue(generator="system-uuid")
	@GenericGenerator(name="system-uuid", strategy = "uuid")
	@Column(name = "ID")
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}

	@Column(name = "NAME", length = 500)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	@ManyToOne(cascade={CascadeType.ALL})
  	@JoinColumn(name="class_id")     //student类中对应外键的属性:classid
	public Clazz getClazz() {
		return clazz;
	}
	public void setClazz(Clazz clazz) {
		this.clazz = clazz;
	}

}

classes:

/**
 *
 */
package com.wonders.task.sample.bo;

import java.util.Set;

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

import org.hibernate.annotations.GenericGenerator;

/**
 * @ClassName: Clazz
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author zhoushun
 * @date 2014年2月27日 上午11:48:47
 *
 */
@Entity
@Table(name="Z_CLASS")
public class Clazz implements java.io.Serializable{
	/**
	 *
	 */
	private static final long serialVersionUID = -6224738252966513441L;
	private String id;
	private String name;
	private Set<Student> set;

	@Id
	@GeneratedValue(generator="system-uuid")
	@GenericGenerator(name="system-uuid", strategy = "uuid")
	@Column(name = "ID")
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}

	@Column(name = "NAME", length = 500)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	@OneToMany(cascade=CascadeType.ALL,mappedBy="clazz")
       //@OneToMany(cascade=CascadeType.ALL,mappedBy="clazz",fetch=FetchType.EAGER) 关闭延迟加载。    
	public Set<Student> getSet() {
		return set;
	}
	public void setSet(Set<Student> set) {
		this.set = set;
	}

}

main:

/**
 *
 */
package com.wonders.task.sample.main;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.Resource;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.wonders.schedule.util.SpringBeanUtil;
import com.wonders.task.sample.ITaskService;
import com.wonders.task.sample.bo.Clazz;
import com.wonders.task.sample.bo.Student;

/**
 * @ClassName: TestMain
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author zhoushun
 * @date 2014年2月27日 下午12:18:44
 *
 */

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
/* 功能模块入口点,beanid即数据库配置中的name */
@Service("testMain")
@Scope("prototype")
public class TestMain {
	private HibernateTemplate hibernateTemplate;

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	//注入hibernateTemplate
	@Resource(name="hibernateTemplate")
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	public void test(){
		Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
		Clazz c2 = (Clazz) session.get(Clazz.class, "8a81a97c4471c661014471c669360002");
		//Clazz c2 = (Clazz) main.getHibernateTemplate().get(Clazz.class, "8a81a97c4471c661014471c669360002");
		Hibernate.initialize(c2.getSet());

		System.out.println("11111111111111111111111");
		//session.close();
		Set<Student> sss =  c2.getSet();
		System.out.println("22222222222222222");
		for(Student s: sss){

			System.out.println(s.getName());
		}
	}

	public static void main(String[] args){
		ApplicationContext applicationContext = null;
		String[] fileUrl = new String[]{"classpath*:applicationContext*.xml"};
		applicationContext = new ClassPathXmlApplicationContext(fileUrl);  

		Student s1 = new Student();
		Student s2 = new Student();
		Clazz c1 = new Clazz();
		c1.setName("1班");
		s1.setName("z1");
		s1.setClazz(c1);
		s2.setName("z2");
		s2.setClazz(c1);
		Set<Student> set = new HashSet<Student>();
		set.add(s1);set.add(s2);
		c1.setSet(set);
		TestMain main = (TestMain)SpringBeanUtil.getBean("testMain");
		//main.getHibernateTemplate().save(c1);

//		Session session = main.getHibernateTemplate().getSessionFactory().openSession();
//		Clazz c2 = (Clazz) session.get(Clazz.class, "8a81a97c4471c661014471c669360002");
//		//Clazz c2 = (Clazz) main.getHibernateTemplate().get(Clazz.class, "8a81a97c4471c661014471c669360002");
//		Hibernate.initialize(c2.getSet());
//
//		System.out.println("11111111111111111111111");
//		session.close();
//		Set<Student> sss =  c2.getSet();
//		System.out.println("22222222222222222");
//		for(Student s: sss){
//
//			System.out.println(s.getName());
//		}
		main.test();
		//main.getHibernateTemplate().delete(c2);
	}
}

级联保存

方法1:自动维护两表关系,mappedby 为被拥维护方,即对应的student为维护方

Student s1 = new Student();
		Student s2 = new Student();
		Clazz c1 = new Clazz();
		c1.setName("1班");
		s1.setName("z1");
		s1.setClazz(c1);
		s2.setName("z2");
		s2.setClazz(c1);
		TestMain main = (TestMain)SpringBeanUtil.getBean("testMain");
		main.getHibernateTemplate().save(s1);
		main.getHibernateTemplate().save(s2);

方法2:手动维护,两方都需要set对应对方的变量

Student s1 = new Student();
		Student s2 = new Student();
		Clazz c1 = new Clazz();
		c1.setName("1班");
		s1.setName("z1");
		s1.setClazz(c1);
		s2.setName("z2");
		s2.setClazz(c1);
		Set<Student> set = new HashSet<Student>();
		set.add(s1);set.add(s2);
		c1.setSet(set);
		TestMain main = (TestMain)SpringBeanUtil.getBean("testMain");
		main.getHibernateTemplate().save(c1);

关于延迟加载:

http://blog.csdn.net/z69183787/article/details/20049409

http://blog.csdn.net/z69183787/article/details/17136627

关于mappedby关键字 及一对多 更多的解释:

http://blog.csdn.net/z69183787/article/details/8197106

http://blog.csdn.net/z69183787/article/details/18615577

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skinchqqhah/p/10350065.html

时间: 2024-10-05 05:50:31

Hibernate 一对多注解 实例的相关文章

hibernate一对多注解

package net.zmcheng.model; import java.util.HashSet;import java.util.Set; import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;

Hibernate @OneToMany 一对多注解

配置一 @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="fatherID") //对应儿子类的哪个字段 子类中配置ManyToOne的字段名称 private Set<Child> children; 配置二 @OneToMany(mappedBy = "qeTopic", cascade = CascadeType.ALL, fetch = FetchType.LAZY) //qeTopic

Hibernate中的注解说明

Hibernate中注解注解比较多,常用的也就那么几个,在这里把Hibernate中的注解汇总总结一下. @Entity:将一个类声明为一个实体bean,即一个持久化POJO; @Id:声明bean的标识属性,即和表中的主键对应的属性: @Table:声明bean映射数据库中指定的表: @Column:声明bean的属性到表的列的映射,该注解还有以下属性: name:可选,属性要映射的列明,如果属性名和列名相同则可以省略: unique:可选,是否在该列上设置唯一约束,默认值为false: nu

spring+hibernate实体类注解详解(非原创) + cascade属性取值

@Entity //继承策略.另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(name="INFOM_TESTRESULT") public class TestResult extends IdEntity{} 1 @Entity(name="EntityName") 必须 name为可选,对应数据库中一的个表 2 @Table(name="

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及MyBatis的一些简单介绍. 本文不会对MyBatis作详细说明,大象还是假定阅读本文的朋友对MyBatis(ibatis)有最基本的了解,只有这样才能较好的理解本文的内容.关于MyBatis请查看它的官方文档及其它参考资料,本文不作详细讨论. 一.工程结构图      上面这是典型的Maven项目

Hibernate一对多、多对一关联

一对多.多对一关联:在多方加外键 示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group   多对一单向关联 在User(多方)中建Group(一方)对象,并添加@ManyToOne注解 1.建Group实体类和User实体类,添加Annotation注解,如下 @Entity @Table(name="_group") //group在MySQL中是关键字,不能直接做表名 public class Group { privat

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)

在上一篇文章中我详细的介绍了如何搭建maven环境以及生成一个maven骨架的web项目,那么这章中我将讲述Spring MVC的流程结构,Spring MVC与Struts2的区别,以及例子中的一些配置文件的分析. 一.Spring MVC 3.0介绍 Spring MVC是一个典型的MVC框架,是Spring内置的Web框架,可以作为应用项目的展示层,继Spring 2.0对Spring MVC进行重大升级后,Spring 2.5又为Spring MVC引入了注解驱动功能,再到3.0时代,全

菜鸟学习Hibernate——一对多关系映射

Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创建实体类Classes和实体类Student Classes.java package com.bjpowernode.hibernate; import java.util.Set; public class Classes { private int id; private String nam

hibernate 一对多关联关系(详细分析)

在领域模型中, 类与类之间最普遍的关系就是关联关系. 在 UML 中, 关联是有方向的. 以 Customer 和 Order 为例: 一个用户能发出多个订单, 而一个订单只能属于一个客户. 从 Order 到 Customer 的关联是多对一关联; 而从 Customer 到 Order 是一对多关联 单向关联 双向关联 单向 n-1 单向 n-1 关联只需从 n 的一端可以访问 1 的一端 域模型: 从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Cus