




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
hibernate入门(七)关联关系讨论_多对多关系映射文章分类:Java编程典型实例:一个学生可以有多个老师,同样一个老师可以有多个学生,对此设计如下:学生studnet 表:columnidnameteachers老师teacher 表:columnidnamestudnets在利用学生查到他所有的老师,我们一般会设计中间表,来查找,中间表用来把学生和老师关联,通过此表进行学生和老师之间的交互查找。中间表teacher_student:columnteacher_idstudnet_id 复合主键 在数据库操作中,作以下说明:如果通过老师查找学生,过程:先通过teacher 表查找到id ,再到teacher_student 表中以teacher.id=teacher_student.teacher_id 为查询条件来查找studnent_id, 查找到studnet_id 后,再以teacher_student.stucent_id=student.id 为查询条件来查找所有学生的信息。 同样通过学生查老师,也是类似的过程。 步骤一 、创建实体类Student 、TeacherStudent 类内容如下:省略getXXX() 、setXXX() 方法。packagecom.asm.hibernate.domain;importjava.util.Set;publicclassStudent privateintid ; privateStringname ; privateSetteachers ; Teacher 类内容如下:省略getXXX() 、setXXX() 方法。packagecom.asm.hibernate.domain;importjava.util.Set;publicclassTeacher privateintid ; privateStringname ; privateSetstudents ; 步骤二 、为两个实体创建配置文件(省略了前面的xml 文档声明内容):Student.hbm.xml内容如下: 说明:这里重点说明最后的 配置:(1 )Student 中Set 类型的属性配置一个 元素,其实在前面的一对多中已经出现了 元素的配置,我们可以这样认为“凡是要为某个Set 类型的属性进行映射配置,都可以用 元素来配置”。 中的table 属性为关联表的名称。 (2 )它的子元素 中的column 为关联表中以该映射文件所映射的表的主键为外键的字段名称.(3 ) coumn 属性为关联表中以欲关联类对应表的主键为外键的字段名称。Teacher.hbm.xml内容如下: 由于和Student.hbm.xml 是类似的,这里不作说明,这样也就建立起了双向的多对多关联。要注意他们所依赖的中间表为teacher_student ,所以这里的 元素中的table 属性和teacher 映射文件相同,而特别要注意 和 中column 中属性值的设定。 步骤三 、在主配置文件中关联实体配置文件:只需要增加如下内容: 步骤四 、编写测试文件ManyToManyTest.java :省略导入的包。packagecom.asm.hibernate.test; publicclassManyToManyTest publicstaticvoidmain(String args) add (); staticvoidadd() Session s =null; Transaction tr =null; try s = HibernateUtil.getSession (); tr = s.beginTransaction(); Teacher t1 =newTeacher(); t1.setName( t1Name ); Teacher t2 =newTeacher(); t2.setName( t2Name ); Student s1 =newStudent(); s1.setName( s1Name ); Student s2 =newStudent(); s2.setName( s2Name ); /再增加如下内容进行测试: Set ts =newHashSet(); ts.add(t1); ts.add(t2); Set ss =newHashSet(); ss.add(s1); ss.add(s2); t1.setStudents(ss); t2.setStudents(ss); / s1.setTeachers(ts); / s2.setTeachers(ts); /增加内容完 s.save(s1); s.save(s2); s.save(t1); s.save(t2); mit(); finally if(s !=null) s.close(); 说明:注意以上注释掉的内容,如果去掉会出现异常。理解:加上增加的内容后再执行发现,在开启“数据库显示”功能后,发现控制台中新增加了四条插入语句,且是插入到中间表teacher_student 中,在此处相当于告诉了每个学生所关联到的老师,而如果在mysql 客户端执行“show create table teacher_student ”, 观察它的表结构并结合“去掉注释的报错说明”,就容易理解到为什么不能有注释掉的内容。另需要说明的是“多对多”在操作和性能方面都不太理想,所以它使用较少,一般我们会选择转换成“一对多”的模型,而Hiberante 的“多对多”实现,可能也是转换成两个“一对多”来实现hibernate入门(七)关联关系讨论_一对一关系映射文章分类:Java编程典型的实例:一个人有一个身份证,而一个身份证只属于某一个人。以此为模型实现一对一关系的映射。下面的实例先以主键进行关联:主键关联:从表的主键同时又作为外键参考主表的主键。比如在下面的实例中,人作为主表,身份证作为从表。 步骤一,建立Person 类及相关的实体配置文件。packagecom.asm.hibernate.domain;publicclassPerson privateintid ; privateStringname ; privateIdCardidCard ; . 省略相应的get/set 方法。配置文件:person.hbm.xml和前面的配置一样,只需要留意下 元素,内容如下: 步骤二,建立IdCard 类及相关的实体配置文件。packagecom.asm.hibernate.domain;importjava.util.Date;publicclassIdCard privateintid ; privateDatevalidity ; privatePersonperson ; . 省略相应的get/set 方法。从表配置文件:IdCard.hbm.xml,内容如下: person 配置文件说明:由于上面提到的是采取主键关联,即是说这里的id 即是主键,同时也是(关联相关表的)外键,因此,以下对id 的生成采取了”foreign” 方式,其实这种方式也就指明了主键同时为外键。下面的 指定了外键的参考信息,此元素中的内容指明了它参考 的person 。 注意在 中设定了constrained 属性,其作用是说明该配置文件所映射表的主键同时作为外键,参照关联类对应表的主键。设定了此属性可用“show create table idcard ”查看表idcard 的定义发生了变化。 步骤三,修改主配置文件,关联上面的实体配置文件。 步骤四,编写测试类, OneToOneTest.java内容如下:省略导入的包。packagecom.asm.hibernate.test;publicclassOneToOneTest publicstaticvoidmain(String args) add (); staticvoidadd() Session s =null; Transaction tr =null; try s = HibernateUtil.getSession (); tr = s.beginTransaction(); Person person =newPerson(); person .setName( pName ); IdCard idCard =newIdCard(); idCard.setValidity( newDate(); / 分别注释掉以下两句,看程序执行情况 person .setIdCard(idCard); idCard.setPerson(person ); s.save(person ); s.save(idCard); mit(); finally if(s !=null) s.close(); 说明:留意上面的注释,如果注释掉第一句,发现一切正常,因为主对象是可以没有此属性,它的实体配置文件也基本与前面一样。而如果注释掉下面一句,将会报错,原因是“ attempted to assign id from null one-to-one property: person ”,IdCard 的实体配置文件关联了一个表,而它采取主键关联,而主键关联要依赖于person 属性的id ,如果这里注释掉,即没有了此属性,它也关联不了相应的id 。简单的说,IdCard 来要关联Person ,我们称它为从对象,而person 并不关联谁,我们称为主对象。现在只要记住,从对象关联了表(关联了主对象),必须设定它所关联的主对象属性 步骤五,编写两个查询方法,一个查询主对象,主要代码:staticPerson query( intid) Session s =null; Transaction tr =null; try s = HibernateUtil.getSession (); tr = s.beginTransaction(); Person p = (Person) s.get(Person. class, id); System. out.println( 身份证有效期:+ p.getIdCard().getValidity(); mit(); returnp; finally if(s !=null) s.close(); 然后再在main 方法中调用此方法,并开启控制台数据库库语言显示后,可以从控制台看出查询主对象只select 一次;再增加一个查询从对象的方法,主要代码:staticIdCard query2( intid) Session s =null; Transaction tr =null; try s = HibernateUtil.getSession (); tr = s.beginTransaction(); IdCard idCard = (IdCard) s.get(IdCard. class, id); / System. out.println( 人的名字:+ idCard.getPerson().getName(); / 去掉上一句注释后,发现会查询两次。 mit(); returnidCard; finally if(s !=null) s.close(); 同样在main 方法中调用此方法, 并开启控制台数据库库语言显示后。 从控制台看出也只会查询一次,但是如果去掉注释后发现会查询两次。 接着,在此例的基础上修改成外键关联。外键关联:从表的主键并不作为外键参考主表的主键,而是将其它字段作为外键参的主键。 其实在上例的基础上,我们只需要修改IdCard.hbm.xml 配置文件即可,修改后的内容如下: 说明:由于采取了外键关联,所以 这里的从表的主键将不再作为外键参考主表的主键,所以它会采取一般的方式生成主键,即 生成和以前的那此相同采取“native ”方式。 另注意到, 发现增加了unique 有属性,这样尽管是多对一,但能有效保证实质是一对一。 这时运行原OneToOneTest ,发现仍是和以前一样。 如果我们再修改Person 的实体配置文件 如下: 特别要注意到 property-ref 属性。可以结合执行后表的结构来看。其实如果注释掉此句,其结果就是通过身份证可以查看到Person 的相关信息,但是通过Person 却不能找到身份证信息,因为Hibernate 完全依赖实体配置文件(映射文件)。注释掉当然就不能找到。而事实上这时在OneToOne 中调用query 方法,会发现出现空指针异常。其实在前面的关联关系中,最终都是实现了双向关联,而这里如果注释掉此句,正好成了单向关联的一个例证。hibernate入门(七)关联关系讨论_一对多关系映射文章分类:Java编程2 一对多关系映射:上面提到的多个员工对应于一个部门,是多对一的关系,如果一个部门有多个员工,则用“一对多”的关系来表示这个关系,现接上例继续,以实现一对多的关系映射。具体操作步骤如下: 步骤一,在Department.java 中增加如下内容: privateSetemps ; 及相应的get/set方法。 步骤二,修改Department 的实体配置文件。在class 元素下增加如下内容: 说明: 元素同样是指定一个属性,只不过是指定一个特殊的属性,key 中的column 为映射文件的外键,这里是指Employee.java 相关的实体对象的外键。 中的class 表示关联的外键为Employee 对象,也即Set 中泛型机制指定的类。 步骤三,修改主配置文件,关联上面的实体配置文件。 步骤四,编写测试类, OneToManyTest.java内容(省略导入的包)如下:packagecom.asm.hibernate.test;publicclassOneToManyTest publicstaticvoidmain(String args) add (); query (1); staticDepartment query( intdepartId) Session s =null; try s = HibernateUtil.getSession (); Department depart = (Department) s.get(Department. class, departId); System. out.println( employee size: + depart.getEmps().size(); returndepart; finally if(s !=null) s.close(); staticvoidadd() Session s =null; Transaction tx =null; try Department depart =newDepartment(); depart.setName( departName ); Employee emp1 =newEmployee(); emp1.setName( empName1 ); emp1.setDepart(depart); Employee emp2 =newEmployee(); emp2.setName( empName2 ); emp2.setDepart(depart); / Set emps = new HashSet(); / emps.add(emp1); / emps.add(emp2); / depart.setEmps(emps); s = HibernateUtil.getSession (); tx = s.beginTransaction(); s.save(depart); s.save(emp1); s.save(emp2); mit(); finally if(s !=null) s.close(); 说明:此类比较简单,增加两个员工信息,然后查出,同样可以体现出这种查询的方便,可以查看控制台,发现实质也是进行了两次查询操作。特别注意,上面注释掉的内容,思考怎样实现映射?如果加上注释掉的内容将会在控制台增加两条更新操作(注意更新的内容)。实际上注释掉的内容和已有内容建立了两种关联:“多对一”、“一对多”。2010-07-29hibernate入门(七)关联关系讨论_多对一关系映射文章分类:Java编程1 多对一关系映射:一个部门有可以有多个员工,而一个员工只属于一个部门。从员工角度看,很多员工会隶属一个部门。现以实例说明,实例概要:一个部门类,只有id 和部门名称两个属性。有一个员工类,有id 和员工名称及部门对象三个属性。操作步骤如下: 步骤一,建立Depatment.java 及实体配置文件:packagecom.asm.hibernate.domain;publicclassDepartment privateintid ; privateStringname ; publicintgetId() returnid ; publicvoidsetId( intid) this. id = id; publicString getName() returnname ; publicvoidsetName(String name) this. name = name; - 同包下的实体配置文件:Depart.hbm.xml 以上的操作,没的什么可多言的,和前面的配置是一样的形式。 步骤二, Employee.java 内容如下及实体配置文件packagecom.asm.hibernate.domain;publicclassEmployee privateintid ; privateStringname ; privateDepartmentdepart ; publicintgetId() returnid ; publicvoidsetId( intid) this. id = id; publicString getName() returnname ; publicvoidsetName(String name) this. name = name; publicDepartment getDepart() returndepart ; publicvoidsetDepart(Department depart) this. depart = depart; - 同包下的实体配置文件:Employee.hbm.xml 先来说这个类文件,它的一个重要属性就是 Department 对象,这就是它所关联的一个外键,这里我们只必须记住一点,每个实体类对应于一张表,如果一张表想关联另一张表,则只需要在这张表所对应的实体类中引入它想关联表的实体类对象。再进行简单的配置即可。再来看配置文件,这里主要看这个 元素,它的name 属性仍然是实体类中的属性。column 为对应表的外键。可以留意下数据库表中的相关表。 修改主配置文件,增加以下内容以便找到相应的实体配置文件。 步骤四,编写测试类。类中省略导入包的内容。packagecom.asm.hibernate.test;publicclassManyToOneTest publicstaticvoidmain(String args) add (); staticvoidadd() Session s =null; Transaction tx =null; try Department depart =newDepartment(); depart.setName( departName ); Employee emp =newEmployee(); emp.setName( empName ); emp.setDepart(depart); s = HibernateUtil.getSession (); tx = s.beginTransaction(); s.save(depart); s.save(emp); /交换以上两句的位置,看Hibernate 执行的sql 语句。会再增加一条更新操作。 mit(); finally if(s !=null) s.close(); 说明:以前插入新的记录,都要传递一个实体对象,而这里没有这么做,原因是为了体现出一个插入记录的顺序问题,仔细观察add() 方法,发现先保存的是Department 对象,再保存的是Employee 对象,原因是什么?这里略作说明,我们知道此项目设计的是让Employee 表来关联Department 表,而要想关联此表,必须保证此表已进行存储,这里暂时这样理解,也可以试试颠倒save 方法的顺序,或是不保存depart 来看看效果,这样也许有助理解。简要说明,以上提到的尝试性操作:颠倒顺序,可以通过,只是增加了一条更新操作;不保存dep 则不能通过,原因是此实体对象没有保存;再测试,如果注释掉“ depart.setDname( deptName ); ”后面按正常顺序执行,发现是能正确执行的。只是在数据库的employee 表中depart_id 字段为null ,如果我们在前面设置 中增加:not
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 晚生晚育面试题及答案
- 船舶雷达试题及答案
- 人格游戏测试题及答案
- 山东省考试题及答案
- 2025年助理医师之中西医结合助理医师题库附答案(典型题)
- 21.2.3二次根式的除法(教学课件)数学华东师大版九年级上册
- 保安培训课件现场
- 保安培训日常知识课件
- 保安和消防知识培训总结课件
- 客服运营分红方案(3篇)
- 2024年小学数学教师选调进城考试试卷含答案
- 2025五级应急救援员职业技能精练考试题库及答案(浓缩400题)
- 危险性较大分部分项工程及施工现场易发生重大事故的部位环节的预防监控措施和应急预案
- 夏季四防培训教学课件
- 公路工程标准施工招标文件第七章-技术规范2024年版
- 对药品不良反应及课件
- 肿瘤治疗药物进展
- 静脉血栓栓塞症VTE防治管理手册
- 职业技术学院《临床检验基础》课程标准
- JJF 2195-2025秒表校准规范
- 蔬菜配送司机劳务合同
评论
0/150
提交评论