Hibernate 一對多 多對一 例項 及一些 問題(1)插入及查詢
阿新 • • 發佈:2019-02-02
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()); } }