1. 程式人生 > >Hibernate 一對多 多對一 例項 及一些 問題(1)插入及查詢

Hibernate 一對多 多對一 例項 及一些 問題(1)插入及查詢

 Clazz.java

/**
 * 
 */
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.OneToOne;
import javax.persistence.Table;
import javax.persistence.Version;

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 int version;
	private String id;
	private String name;
	private Set<Student> set;
	private Teacher teacher;
	
	 @Version
	    @Column(name = "version")
	public int getVersion() {
		return version;
	}
	public void setVersion(int version) {
		this.version = version;
	}
	@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.PERSIST,CascadeType.MERGE,CascadeType.REFRESH},mappedBy="clazz") 
	public Set<Student> getSet() {
		return set;
	}
	public void setSet(Set<Student> set) {
		this.set = set;
	}
	
	@OneToOne(cascade=CascadeType.ALL,mappedBy="clazz") 
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	
	
}

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
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;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Where;

/** 
 * @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;
	private String classId;
	
	@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.PERSIST,CascadeType.MERGE}) 
	@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.LAZY) 
	@JoinColumn(name="class_id")
  	//@ManyToOne
  	//@Cascade(value=org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	//@JoinColumn(name="class_id" ,nullable = true,insertable=false,updatable=false)     //student類中對應外來鍵的屬性:classid 
	//@Where(clause = "removed=0")
	public Clazz getClazz() {
		return clazz;
	}
	public void setClazz(Clazz clazz) {
		this.clazz = clazz;
	}
	
	@Transient
	@Column(name = "CLASS_ID", length = 50)
	public String getClassId() {
		return classId;
	}
	public void setClassId(String classId) {
		this.classId = classId;
	}
	
	
}


測試類:

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

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

import javax.annotation.Resource;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
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;
import com.wonders.task.sample.bo.Teacher;

/** 
 * @ClassName: TestMain 
 * @Description: TODO(這裡用一句話描述這個類的作用) 
 * @author zhoushun 
 * @date 2014年2月27日 下午12:18:44 
 *  
 */

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
/* 功能模組入口點,beanid即資料庫配置中的name */
@Service("execMain")
@Scope("prototype")
public class ExecMain {
	private HibernateTemplate hibernateTemplate;
	
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}
	
	//注入hibernateTemplate
	@Resource(name="hibernateTemplate")
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
	
	private static SessionFactory sf;
	
	
	
	public static SessionFactory getSf() {
		return sf;
	}

	@Resource(name="sessionFactory")
	public void setSf(SessionFactory sf) {
		this.sf = sf;
	}

	public static void main(String[] args){
		ApplicationContext applicationContext = null;  
		String[] fileUrl = new String[]{"classpath*:applicationContext*.xml"};  
		applicationContext = new ClassPathXmlApplicationContext(fileUrl);  		
		ExecMain main = (ExecMain)SpringBeanUtil.getBean("execMain");
		
		//1  多方插入
//		Clazz c = new Clazz();
//		c.setName("class");
//		Student s = new Student();
//		s.setName("student");
//		s.setClazz(c);
//		main.getHibernateTemplate().save(s);
		
		//2一方插入
//		Clazz c = new Clazz();
//		c.setName("class2");
//		Student s1 = new Student();
//		s1.setName("student1");
//		Student s2 = new Student();
//		s2.setName("student2");
//		s1.setClazz(c);s2.setClazz(c);
//		Set<Student> set = new HashSet<Student>();
//		set.add(s1);set.add(s2);
//		c.setSet(set);
//		main.getHibernateTemplate().save(c);
		
		//3一方查詢 lazy 就報錯 因為 延遲載入 一方 fetchType 預設lazy
		//解決方法:lazy改成eager  或者hql left join fetch
		//Clazz c = main.getHibernateTemplate().get(Clazz.class, "8a81a97c452741d701452741de480002");
//		String hql = "from Clazz c left join fetch c.set";
//		Session session = main.getHibernateTemplate().getSessionFactory().
//				openSession();
//		Clazz c = (Clazz) session.createQuery(hql).uniqueResult();
//		//Clazz c = (Clazz) session.get(Clazz.class, "8a81a97c452741d701452741de480002");
//		session.close();
//		System.out.println(c.getName());
//		System.out.println(c.getSet().size());
		
		//4多方查詢 lazy 就報錯 因為 延遲載入 多方 fetchType 預設 eager
		//解決方法:lazy改成eager  或者hql left join fetch
		//Student s = main.getHibernateTemplate().get(Student.class, "8a81a97c452741d701452741df130003");
//		String hql = "from Student s left join fetch s.clazz where s.id = '8a81a97c452741d701452741df130003'";
//		Session session = main.getHibernateTemplate().getSessionFactory().
//				openSession();
//		Student s = (Student) session.createQuery(hql).uniqueResult();
//		System.out.println(s.getClazz().getName());
	
		
		
		
		
	}
}