首页 > 代码库 > Hibernat之关系的处理一对多/多对一
Hibernat之关系的处理一对多/多对一
第一步:编写两个pojo,比如一个学生表一个班级表 这里使用注解。
需要
班级表:
1 package com.qcf.pox; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.CascadeType; 7 import javax.persistence.Column; 8 import javax.persistence.Entity; 9 import javax.persistence.GeneratedValue;10 import javax.persistence.GenerationType;11 import javax.persistence.Id;12 import javax.persistence.OneToMany;13 import javax.persistence.Table;14 15 import org.hibernate.annotations.Cascade;16 import org.hibernate.annotations.Formula;17 //实体类18 @Entity19 @Table(name="_class")20 public class ClassName {21 @Id22 @GeneratedValue(strategy=GenerationType.AUTO)//设置id生成方式23 private int classid;24 @Column(name="classname")25 private String name;26 /*27 * 用一个查询语句动态的生成一个类的属性. 表示这个属性是一个虚拟的列,表中并没有这个列。需要通过查询语句计算出来。28 */29 //@Formula("(select count(*) from student s where s.className_classid=classid)")30 private int num;31 /*32 * mappedBy指定谁来维护关系,mappedBy在一方表示由多方来维护关系,在进行操作时要注意不要使用这一方来save,update等操作33 */34 @OneToMany(mappedBy="classname",cascade=CascadeType.ALL)35 private Set<Student> students=new HashSet<Student>();36 37 public ClassName(int classid, String name, int num, Set<Student> students) {38 super();39 this.classid = classid;40 this.name = name;41 this.num = num;42 this.students = students;43 }44 public Set<Student> getStudents() {45 return students;46 }47 public void setStudents(Set<Student> students) {48 this.students = students;49 }50 public int getClassid() {51 return classid;52 }53 public void setClassid(int classid) {54 this.classid = classid;55 }56 public String getName() {57 return name;58 }59 public void setName(String name) {60 this.name = name;61 }62 public int getNum() {63 return num;64 }65 public void setNum(int num) {66 this.num = num;67 }68 public ClassName(int classid, String name, int num) {69 super();70 this.classid = classid;71 this.name = name;72 this.num = num;73 }74 public ClassName() {75 super();76 }77 78 79 }
学生表:
1 package com.qcf.pox; 2 3 import java.util.Date; 4 5 import javax.persistence.Entity; 6 import javax.persistence.FetchType; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.GenerationType; 9 import javax.persistence.Id;10 import javax.persistence.ManyToOne;11 12 @Entity 13 public class Student {14 15 @Id16 @GeneratedValue(strategy=GenerationType.AUTO)//代表主键的生成策略17 private int stuno;18 private String stuname;19 private Date birthday;20 21 @ManyToOne22 private ClassName classname;23 public int getStuno() {24 return stuno;25 }26 public ClassName getClassName() {27 return classname;28 }29 public void setClassName(ClassName className) {30 this.classname = className;31 }32 public void setStuno(int stuno) {33 this.stuno = stuno;34 }35 public String getStuname() {36 return stuname;37 }38 public void setStuname(String stuname) {39 this.stuname = stuname;40 }41 public Date getBirthday() {42 return birthday;43 }44 public void setBirthday(Date birthday) {45 this.birthday = birthday;46 }47 public Student() {48 super();49 }50 public Student(int stuno, String stuname, Date birthday) {51 super();52 this.stuno = stuno;53 this.stuname = stuname;54 this.birthday = birthday;55 }56 57 }
第二步:在hibernate.cfg.xml文件中引入这两个po类
1 <!-- 引入映射文件 -->2 3 <mapping class="com.qcf.pox.Student"/>4 <mapping class="com.qcf.pox.ClassName"/>
第三步:编写测试代码
1 package com.qcf.test; 2 3 import java.util.Date; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.Transaction; 8 import org.hibernate.cfg.AnnotationConfiguration; 9 import org.hibernate.cfg.Configuration;10 11 import com.qcf.pox.ClassName;12 import com.qcf.pox.Student;13 14 public class TestManyToOne {15 public static void main(String[] args) {16 //获取hibernate配置文件并取得session对象17 Configuration configuration=new AnnotationConfiguration().configure();18 SessionFactory factory=configuration.buildSessionFactory();19 Session session=factory.openSession();20 //开启事务21 Transaction transaction=session.beginTransaction();22 //创建classname实例23 ClassName className=new ClassName();24 className.setName("java");25 26 //创建student实例27 Student student=new Student();28 29 student.setStuname("zhangsan");30 student.setBirthday(new Date());31 student.setClassName(className);32 session.save(className);33 session.save(student);34 //提交事务35 transaction.commit();36 //关闭session37 session.close();38 }39 40 }
问题:
在测试代码中,我让学生多方来维护关系,而且级联设置的为全部,这里为什么在测试代码中还有先save班级表再save学生呢?为什么不能只在save学生表?
Hibernat之关系的处理一对多/多对一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。