您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Hibernate一对多映射
hibernate一对多关联映射—单向一、简述一对多关联映射(one-to-many)1、在对象模型中,一对多的关联关系,使用集合表示比如Classes(班级)和Student(学生)之间是一对多的关系publicclassClasses{privateStringid;privateStringname;privateSetstudents;}publicclassStudent{publicStringid;publicStringname;}2、我们以前学过学生对班级是多对一,返过来,班级对学生就是一对多。3、我们多对一的关系是用户和组。返过来看,从组这边来看,就是一对多了。下面学生的示例是班级和学生。和用户和组是一样的。一个班级有多个学生,这是一对多的关系;返过来,多个学生属于一个班级,这就是多对一了。4、建立对象模型5、这两个对象模型之间是有关系的。我们现在讲的是一对多。一的一端是班级。多的一端是学生。那么怎么样能体现出这种关系呢?我们在学习多对一时,是在多的一端加上一个字段。这个字段做为外键关联一的一端。多对一,就是我们在看到学生的时候,能够知道这个学生是哪个班级的。或者是当我们看到用户的时候,知道这个用户是哪个组的。所以在用户里面持有组的引用。6、那么一对多,就是一个组里面有多少个用户。所以要维护这种关系,必须在组里面持有用户的集合。班级和学生也是一样的。一个班级有多少学生,所以在班级里面要持有相应的学生的集合。如下图我们用Set,通常用户Set做映射。箭头表示两者之间是有关系的。7、上面的是对象模型,那么这种模型要映射成什么样呢?当我们定义多对一的关系时,在加载多的一端时,能够把1的一端加载上来。因为两者之间是有关系的。同理,一对多也是一样的,它要维护这种关系。这种关系就是一对多。一的一端要指向多。在维护这种关系时,在加载一的时候,就会把一的一端加载上来。也就是说,在我在加载班级时,这个班级有多少个学生,它会把所有的学生自动查询上来,放到Set集合里面。这就是维护这个关系的目的。8、我们知道,实体类要映射成表。所在下面画两个表。依我们来看,是先有班级。再分配学生。学生有了,班级有了。要保证知道一个班级有多少学生。因为students这个集合是在Classes上,要映射它的时候,那么我们是要在t_classes表上加一个字段,然后将所有的学生用,表达式表达出来吗?可是这样做不符合数据库的设计范式。9、所以说,这种关系的维护应该是在t_student这一端。也就是说,在t_student表中加一个字段,这个字段就是classesid。也就是说,一对多关联映射,要把两个表的关联字段加到多的一端。10、所以说,一对多与多对一的映射是一样的。没有区别。都在多的一端加一个外键,指向一的一端。但是两者也是有区别的。区别就是关系。如果维护的是多对一,则加载多的时候,能把1加上来。如果维护的是一对多,则加载班级时,能把WHSD1011对应的两个学生加载上来。我的理解:对于要相关联的表来说,如果一个表想要看到对方的表内容,则就要在自己的实体类中持有对方的引用。如果只有一方看到另一方,就是单向的。如果要双方都看到,就要在实体模型中彼此都持有对方的引用。二、新建项目hibernate_one2many_1(拷贝hibernate_session)这个项目就O了。:我们这个实例还是单向的。只能在加载班级时,把所有的学生加载上来。但是当把学生拿上来的时候,看不到这个学生所在的班级。三、建立对象模型1、注意:一对多关联映射,通常用Set这个集合,那么为什么用Set呢?我们可以这样理解:Set里面的对象是不能重复的。当然也可以用其他的。不过一般情况下用Set。一定要用Set这个接口,而不用HashSet。因为Hibernate中有延迟加载。实体对象就实现了延迟加载。也就是采用代理的方式。集合也有延迟加载。hibernate中对JDK中的Set集合进行了扩展,也就是实现了这个接口,所以不能用HashSet。所以要用Set接口。因为hibernate对Set有相应的实现,对Set进行了扩展。2、我们的Set里面就是Student对象的集合。这样就构成了一对多的关系。2.1Classes.javapackagecom.bjsxt.hibernate;importjava.util.Set;publicclassClasses{privateintid;privateStringname;privateSetstudents;publicSetgetStudents(){returnstudents;}publicvoidsetStudents(Setstudents){this.students=students;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}2.2Student.javapackagecom.bjsxt.hibernate;publicclassStudent{privateintid;privateStringname;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}四、对象模型建立好之后,就开始写映射文件,这是hibernate开发的正确思路。1、在写映射文件时,先从简单的写起。写Students.hmb.xml文件。?xmlversion=1.0?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=com.bjsxt.hibernate.Studenttable=t_studentidname=id!--主键的生成方式不能是uuid。因为这种生成方式是生成32位16进制的字符串而我们的实体类中id的类型为int.所以要修改主键的生成方式为native.就是以数字形式自增--generatorclass=native/generator/idpropertyname=name//class/hibernate-mapping2、再映射难一点的,Classes.hbm.xml文件如下:?xmlversion=1.0?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=com.bjsxt.hibernateclassname=Classestable=t_classesidname=idgeneratorclass=native/generator/idpropertyname=name/!--上面为简单属性下面要看一下集合要如何映射答:集合要用set标签来映射set标签的名字属性的值就是Classes类中的集合类型数据的变量名--setname=students!--那么要如何映射set里面的东西呢?我们知道ont2many的映射关系,与many2one的映射是一样的,要在多的一端加字段的。但是到目前为止,在t_student这张表里面是没有classid这个字段标识的。所以要把这个字段加过来,加过来之后,还要做为外键指向t_classes这张表的主键我们用key标签来实现--!--在key标签里面要使用的属性是列,就是给定在t_student表中的加上的列的名字。加了key这个标签后,就会把classid这个字段加入到t_student这张表里面了,它做为外键指向t_class表的id字段。--keycolumn=classid/key!--接下来,采用one-to-many这个标签,采用这个标签,一方面是一对多,另一方面,要用class这个属性来指定Classes.java类中的students这个集合里面到底是什么元素。我们这个实例里面是Student对象集合。一定要指定集合中的元素是什么类型的对象。--one-to-manyclass=Student/!--ont-to-many标签就代表了students集合里面是Student对象。这样指明之后,classes就能找到student这张表。因为student在这里都写了。而且在Student.hbm.xml文件中,也已经映射Student对象映射到哪张表了。这样就可以把classid加到表t_student里面,而且做为外键指向t_classes表的主键id.--/set/class/hibernate-mapping五、到hibernate.cfg.xml文件中,修改数据库,并把我们的两个实体类加到配置文件中文件内容为:!DOCTYPEhibernate-configurationPUBLIC-//Hibernate/HibernateConfigurationDTD3.0//EN!--数据库改成hibernate_session--propertyname=hibernate.connection.urljdbc:mysql://localhost/hibernate_one2many_1/propertypropertyname=hibernate.connection.driver_classcom.mysql.jdbc.Driver/propertypropertyname=hibernate.connection.usernameroot/propertypropertyname=hibernate.connection.passwordroot/propertypropertyname=hibernate.dialectorg.hibernate.dialect.MySQLDialect/propertypropertyname=hibernate.show_sqltrue/propertymappingresource=com/bjsxt/hibernate/Classes.hbm.xml/mappingresource=com/bjsxt/hibernate/Student.hbm.xml//session-factory/hibernate-configuration六、打MySql,创建数据库root;createdatabasehibernate_one2many_1;usehibernate_one2many_1;showtables;七、执行ExportDB.class类,将对象导出为表ExportDB.class文件内容为:packagecom.bjsxt.hibernate;importorg.hibernate.cfg.Configur
本文标题:Hibernate一对多映射
链接地址:https://www.777doc.com/doc-3977155 .html