前言 本篇文章引导你通过Spring Boot,Spring Data JPA和MySQL实现one-to-many和many-to-one关联映射。
本篇文章引导你通过Spring Boot,Spring Data JPA和MySQL 映射一对一外键、一对一主键、一对多,多对一,多对多、多对多额外的列的关系。
Hibernate的多对一映射(Many-to-One)用于建立两个实体类之间的关联关系,其中一个实体类可以关联到多个另一个实体类的实例,而另一个实体类只能关联到一个特定的实例。 一、映射文件的配置 在Hibernate的映射文件中,使用<many-to-one>元素来定义多对一关系的映射。 下面是<many-to-one>元素的常用属性:name:指定Java类中表示多对一关系的属性名。class:指定关联的另一个实体类。column:指定关联的数据库表中的外键列名。 name="firstName" column="first_name"/> <property name="lastName" column="last_name"/> <many-to-one <property name="name" column="department_name"/> </class></hibernate-mapping>在上述示例中,Employee类通过<many-to-one
<many-to-one>:定义多对一关系的映射。<one-to-many>:定义一对多关系的映射。<many-to-many>:定义多对多关系的映射。<join>:定义表间连接关系的映射。 name="firstName" column="first_name"/> <property name="lastName" column="last_name"/> <many-to-one 在<class>元素内部可以定义<id>、<property>、<many-to-one>等子元素。<id> 元素 <id>元素用于定义主键字段的映射。 <many-to-one> 元素 <many-to-one>元素用于定义多对一关系的映射。
--维护多对一关系--> <many-to-one name="group" column="groupid" cascade="save-update"/> </class> </hibernate-mapping idCard" constrained="true"/> </class> </hibernate-mapping> 唯一外键关联 外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one Person.hbm.xml的主键生成策略为native,使用<many-to-one>标签来维护外键,<many-to-one name=”idCard” unique=”true”/>。 2、在person.hbm.xml中添加<many-to-one>标签 <many-to-one name="idCard" unique="true"/> 在IdCard端新加入如下标签映射: 一对多双向关联的映射方式: * 在一的一端的集合上采用<key>标签,在多的一端加入一个外键 * 在多的一端采用<many-to-one>标签 注意:<key>标签和<many-to-one>标签加入的字段保持一直
– Associations –> <many-to-one name=”member” class=”com.esse.projects.cpinfo.entity.Member” insert =”false” update=”false”> <column name=”MEMBER_ID” /> </many-to-one> <many-to-one com.esse.projects.cpinfo.entity.MemberRecord” insert=”false” update=”false”> <column name=”MEMBERRECORD_ID” /> </many-to-one MemberList.hbm.xml文件原来, <key-property name=”memberId” type=”long” column=”Member_ID” /> <many-to-one
" constrained="true"/> </class> </hibernate-mapping> *唯一外键关联:外键关联,本来是用于多对一的配置,可是加上唯一的限制之后(採用<many-to-one 映射实现:在单向一端加入<many-to-one /> <hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table ="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class> </hibernate-mapping> 2、多对一关联: 映射实现:在多的一端加入<many-to-one table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one
<column name="jdid" /> <generator class="native" /> </id> <many-to-one fetch="select" lazy="false" cascade="all"> <column name="qxid" not-null="true" /> </many-to-one "java.lang.String"> <column name="jd" length="50" /> </property> </class> < many-to-one <column name="jdid" /> <generator class="native" /> </id> <many-to-one fetch="select" lazy="false" cascade="all"> <column name="qxid" not-null="true" /> </many-to-one
③一般属性 ④特殊属性:年龄,工龄等 二、Hibernate映射(由于之前只看过MyBatis没看过Hibernate,所以写的比较啰嗦) 1、多对一 <many-to-one -- parent属性,本类与Department(父类) 为多对一的关系 --> <many-to-one name="parent" class="Department" column="parentId "></many-to-one> <!
constrained="true"/> </class> </hibernate-mapping> 唯一外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one 需要在Person.hbm.xml映射文件中配置many-to-one标签,并指定unique为true,如下: <?xml version="1.0"?> <! idCard</param> </generator> </id> <property name="name"/> <many-to-one 单向多对一关联映射(many-to-one): 多对一关联映射原理:在多的一端加入一个外键,指向一的一端,如下图: ? 双向一对多关联的映射方式: 在一的一端的集合上采用<key>标签,在多的一端加入一个外键 在多的一端采用<many-to-one>标签 注意:<key>标签和<many-to-one>标签加入的字段要保持一致
--配置多对一的关联关系--> <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid"> </many -- 配置多对一关联关系 --> <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade ="all"></many-to-one> <! -- 配置多对一关联关系 --> <many-to-one name="多对一中一对象的属性的名称" class="一对象的类的全名" column="外键的列名" cascade="all "></many-to-one>
xml配置方式 设置 lazy=”false” 例: <many-to-one name="childQuestion" class="com.newland.netsurvey.model.Question " lazy="false" fetch="select"> <column name="childQuestionId" /> </many-to-one> @注解方式
在面向对象设计与实体模型关系中,对象间关系一般包括 4 种:一对一 ( one-to-one)、一对多 ( one-to-many)、多对一(many-to-one)、多对多 (many-to-many name="board" class="Board" fetch="select"> <column name="board_id" /> </many-to-one name="board" class="Board" fetch="select"><column name="board_id" /></many-to-one>则指定在Thread表中添加一个外键指向 我们发现只要在对象上设置了关联关系,Hibernate会自动完成到数据库的转换,在Hibernate中可以使用many-to-one标签来映射多对一关联,many-to-one常用属性如表2-1-1所示 表2-1-1 many-to-one元素常用属性 属性 含义 必须 默认值 name 属性的名称 Yes class 关联类的类名 No column 关联的字段 No not-null
one-to-many class=”com.mr.product.Product”/> </set> product配置: //定义多对一映射 <many-to-one name=”factory” class=”com.mr.factory.Factory”> <column name=”factoryid”> </many-to-one > 一对一外键关联 — 实际上就是多对一关联的一个特例而已,须要保证关联字段的唯一性, 在<many-to-one >元素中通过 unique属性就可实现关联字段的唯一性 配置一对一关联: People <—> IDcard People映射配置:一对一映射 <many-to-one name=”idcard” unique=”true”> <column name=”card_id”/> </many-to-one
name="firstName" column="first_name"/> <property name="lastName" column="last_name"/> <many-to-one hibernate-mapping>上述示例中,<class>元素定义了Employee类和Department类与数据库表的映射关系,<id>元素定义了主键字段的映射,<property>元素定义了普通字段的映射,<many-to-one
column="itemId"/> <one-to-many class="com.ssy.entity.Enroll"/></set> Enroll类mapping(省略其他属性配置) <many-to-one name="athletes" class="com.ssy.entity.Athletes" column="athletesId" lazy="false" cascade="all"/> <many-to-one
在多的一方只有一个many-to-one标签里面name属性也是关联属性名,class属性关系表它的domain地址,还有一个column外键 <hibernate-mapping> <class class="identity"/> </id> <property name="stu_name" /> <property name="stu_age" /> <many-to-one name="stu_class" class="com.hao.domain.Classes" column="class_id" lazy="false"></many-to-one> </class ="com.hao.domain.Student" ></one-to-many> </set> 还可以写在Student的映射文件,这样保存student就会同时保存关联的classes信息 <many-to-one cascade="save-update" name="stu_class" class="com.hao.domain.Classes" column="class_id" lazy="false" ></many-to-one
column="certificate_name"/> <property name="certificateNo" column="certificate_no"/> <many-to-one name="student" column="student_id"></many-to-one> </class> </hibernate-mapping> <many-to-one name ="student" column="student_id"></many-to-one> 增、删、改 @Test public void addTest() { Student student
"> <column name="id" /> <generator class="native" /> </id> <many-to-one author" class="com.pxy.entity.Author" fetch="select"> <column name="author_id" /> </many-to-one java.lang.String"> <column name="type" length="20" /> </property> </class> 里面的many-to-one 我们将Blog的映射文件中many-to-one中的fetch的值设置为join,结果如下图: ? 区别是不是很明显!!! 使用join后,默认就使用多表联合的方式查询了所有的数据。
PersonAddress” optional=”true”> <key column=”personId” unique=”true”/> <many-to-one column name=”EMPID” length=”20″ /> <generator class=”assigned” /> </id> <many-to-one com.morris.hql.entity.Department” fetch=”select”> <column name=”DEPTID” length=”20″ /> </many-to-one