Hibernate 一对多注解实例源码介绍



Hibernate 一对多注解实例源码介绍。

student:

 

  1. /**
  2. *
  3. */
  4. package com.wonders.task.sample.bo;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.GeneratedValue;
  9. import javax.persistence.Id;
  10. import javax.persistence.JoinColumn;
  11. import javax.persistence.ManyToOne;
  12. import javax.persistence.Table;
  13. import org.hibernate.annotations.GenericGenerator;
  14. /**
  15. * @ClassName: Student
  16. * @Description: TODO(这里用一句话描述这个类的作用)
  17. * @author zhoushun
  18. * @date 2014年2月27日 上午11:48:30
  19. *
  20. */
  21. @Entity
  22. @Table(name=”Z_STUDENT”)
  23. public class Student {
  24.     private String id;
  25.     private String name;
  26.     private Clazz clazz;
  27.     @Id
  28.     @GeneratedValue(generator=”system-uuid”)
  29.     @GenericGenerator(name=”system-uuid”, strategy = “uuid”)
  30.     @Column(name = “ID”)
  31.     public String getId() {
  32.         return id;
  33.     }
  34.     public void setId(String id) {
  35.         this.id = id;
  36.     }
  37.     @Column(name = “NAME”, length = 500)
  38.     public String getName() {
  39.         return name;
  40.     }
  41.     public void setName(String name) {
  42.         this.name = name;
  43.     }
  44.     @ManyToOne(cascade={CascadeType.ALL})
  45.     @JoinColumn(name=”class_id”)     //student类中对应外键的属性:classid
  46.     public Clazz getClazz() {
  47.         return clazz;
  48.     }
  49.     public void setClazz(Clazz clazz) {
  50.         this.clazz = clazz;
  51.     }
  52. }
/**
 * 
 */
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:

 

 

  1. /**
  2. *
  3. */
  4. package com.wonders.task.sample.bo;
  5. import java.util.Set;
  6. import javax.persistence.CascadeType;
  7. import javax.persistence.Column;
  8. import javax.persistence.Entity;
  9. import javax.persistence.GeneratedValue;
  10. import javax.persistence.Id;
  11. import javax.persistence.OneToMany;
  12. import javax.persistence.Table;
  13. import org.hibernate.annotations.GenericGenerator;
  14. /**
  15. * @ClassName: Clazz
  16. * @Description: TODO(这里用一句话描述这个类的作用)
  17. * @author zhoushun
  18. * @date 2014年2月27日 上午11:48:47
  19. *
  20. */
  21. @Entity
  22. @Table(name=”Z_CLASS”)
  23. public class Clazz implements java.io.Serializable{
  24.     /**
  25.      *
  26.      */
  27.     private static final long serialVersionUID = -6224738252966513441L;
  28.     private String id;
  29.     private String name;
  30.     private Set<Student> set;
  31.     @Id
  32.     @GeneratedValue(generator=”system-uuid”)
  33.     @GenericGenerator(name=”system-uuid”, strategy = “uuid”)
  34.     @Column(name = “ID”)
  35.     public String getId() {
  36.         return id;
  37.     }
  38.     public void setId(String id) {
  39.         this.id = id;
  40.     }
  41.     @Column(name = “NAME”, length = 500)
  42.     public String getName() {
  43.         return name;
  44.     }
  45.     public void setName(String name) {
  46.         this.name = name;
  47.     }
  48.     @OneToMany(cascade=CascadeType.ALL,mappedBy=”clazz”)
  49.        //@OneToMany(cascade=CascadeType.ALL,mappedBy=”clazz”,fetch=FetchType.EAGER) 关闭延迟加载。
  50.     public Set<Student> getSet() {
  51.         return set;
  52.     }
  53.     public void setSet(Set<Student> set) {
  54.         this.set = set;
  55.     }
  56. }
/**
 * 
 */
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:

  1. /**
  2. *
  3. */
  4. package com.wonders.task.sample.main;
  5. import java.util.HashSet;
  6. import java.util.Set;
  7. import javax.annotation.Resource;
  8. import org.hibernate.Hibernate;
  9. import org.hibernate.Session;
  10. import org.springframework.context.ApplicationContext;
  11. import org.springframework.context.annotation.Scope;
  12. import org.springframework.context.support.ClassPathXmlApplicationContext;
  13. import org.springframework.orm.hibernate3.HibernateTemplate;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Propagation;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import com.wonders.schedule.util.SpringBeanUtil;
  18. import com.wonders.task.sample.ITaskService;
  19. import com.wonders.task.sample.bo.Clazz;
  20. import com.wonders.task.sample.bo.Student;
  21. /**
  22. * @ClassName: TestMain
  23. * @Description: TODO(这里用一句话描述这个类的作用)
  24. * @author zhoushun
  25. * @date 2014年2月27日 下午12:18:44
  26. *
  27. */
  28. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  29. /* 功能模块入口点,beanid即数据库配置中的name */
  30. @Service(“testMain”)
  31. @Scope(“prototype”)
  32. public class TestMain {
  33.     private HibernateTemplate hibernateTemplate;
  34.     public HibernateTemplate getHibernateTemplate() {
  35.         return hibernateTemplate;
  36.     }
  37.     //注入hibernateTemplate
  38.     @Resource(name=”hibernateTemplate”)
  39.     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  40.         this.hibernateTemplate = hibernateTemplate;
  41.     }
  42.     public void test(){
  43.         Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
  44.         Clazz c2 = (Clazz) session.get(Clazz.class, “8a81a97c4471c661014471c669360002″);
  45.         //Clazz c2 = (Clazz) main.getHibernateTemplate().get(Clazz.class, “8a81a97c4471c661014471c669360002″);
  46.         Hibernate.initialize(c2.getSet());
  47.         System.out.println(“11111111111111111111111″);
  48.         //session.close();
  49.         Set<Student> sss =  c2.getSet();
  50.         System.out.println(“22222222222222222″);
  51.         for(Student s: sss){
  52.             System.out.println(s.getName());
  53.         }
  54.     }
  55.     public static void main(String[] args){
  56.         ApplicationContext applicationContext = null;
  57.         String[] fileUrl = new String[]{“classpath*:applicationContext*.xml”};
  58.         applicationContext = new ClassPathXmlApplicationContext(fileUrl);
  59.         Student s1 = new Student();
  60.         Student s2 = new Student();
  61.         Clazz c1 = new Clazz();
  62.         c1.setName(“1班”);
  63.         s1.setName(“z1″);
  64.         s1.setClazz(c1);
  65.         s2.setName(“z2″);
  66.         s2.setClazz(c1);
  67.         Set<Student> set = new HashSet<Student>();
  68.         set.add(s1);set.add(s2);
  69.         c1.setSet(set);
  70.         TestMain main = (TestMain)SpringBeanUtil.getBean(“testMain”);
  71.         //main.getHibernateTemplate().save(c1);
  72. //      Session session = main.getHibernateTemplate().getSessionFactory().openSession();
  73. //      Clazz c2 = (Clazz) session.get(Clazz.class, “8a81a97c4471c661014471c669360002″);
  74. //      //Clazz c2 = (Clazz) main.getHibernateTemplate().get(Clazz.class, “8a81a97c4471c661014471c669360002″);
  75. //      Hibernate.initialize(c2.getSet());
  76. //
  77. //      System.out.println(“11111111111111111111111″);
  78. //      session.close();
  79. //      Set<Student> sss =  c2.getSet();
  80. //      System.out.println(“22222222222222222″);
  81. //      for(Student s: sss){
  82. //
  83. //          System.out.println(s.getName());
  84. //      }
  85.         main.test();
  86.         //main.getHibernateTemplate().delete(c2);
  87.     }
  88. }
/**
 * 
 */
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为维护方


 

  1. Student s1 = new Student();
  2.         Student s2 = new Student();
  3.         Clazz c1 = new Clazz();
  4.         c1.setName(“1班”);
  5.         s1.setName(“z1″);
  6.         s1.setClazz(c1);
  7.         s2.setName(“z2″);
  8.         s2.setClazz(c1);
  9.         TestMain main = (TestMain)SpringBeanUtil.getBean(“testMain”);
  10.         main.getHibernateTemplate().save(s1);
  11.         main.getHibernateTemplate().save(s2);
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对应对方的变量

 

  1. Student s1 = new Student();
  2.         Student s2 = new Student();
  3.         Clazz c1 = new Clazz();
  4.         c1.setName(“1班”);
  5.         s1.setName(“z1″);
  6.         s1.setClazz(c1);
  7.         s2.setName(“z2″);
  8.         s2.setClazz(c1);
  9.         Set<Student> set = new HashSet<Student>();
  10.         set.add(s1);set.add(s2);
  11.         c1.setSet(set);
  12.         TestMain main = (TestMain)SpringBeanUtil.getBean(“testMain”);
  13.         main.getHibernateTemplate().save(c1);
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

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