Hibernate视频学习笔记(4)多对一及一对一关联映射

 

多对一many-to-one

用户和组

public class Group {

       private String id;

       private String name;

}

 

public class User {

       private String id;

       private String name;

 

       private Group group;

}

 

 

 

t_classes

id     |    name

1     |   尚学堂

t_student

id     |    name     |   classesid

1      |   10        |     1

2      |   祖儿      |     1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


关系映射的本质:

将关联关系映射到数据库,所谓的关联关系是对象模型内存中的一个或多个引用

 

persistence对象不能应用transient对象

save时就发出insert语句

一般可以先保存主表对象,然后保存从表对象

 

除了正常方式,可以变通:

<many-to-one name="group" column="groupid" cascade="all"/>

cascade:all, none, save-update, delete默认是none

在存user时先将group存了

采用cascade属性是解决TransientObjectException异常的一种手段

 

变通的手段不那么推荐,因为不符合正常逻辑

加载多的时候就会加载1

<many-to-one>会在多的一端加入一个外键,指向1的一端,这个外建是由<many-to-one>中的column属性定义的,如果忽略这个属性那么默认的外建与实体的属性一致

 

<many-to-one>标签的定义实例:

理解级联的含义?

是对象的连锁操作

 

一对一:

Person-IdCard

两种策略实现一对一关联映射

主键关联单向:person相对card时外建表,参照cardid

 

 

t_person

id    |    name

1               10

2               容祖儿

t_idcard

id    |    cardNo

1    |   8888888888

2    |   9999999999

 

 



hibernate一对一主键关联单向

           <generator class="foreign">

              <param name="property">idCard</param>

           </generator>

 

<one-to-one name="idCard" constrained="true"></one-to-one>

constrained属性代表要增加外建引用约束

 

只有一对一主建关联映射中内置默认了cascade=true

 

one-to-one是告诉如何加载

一对一主建关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

具体映射

       <id name="id">

           <!—person的主键来源于idCard, 也就是共享idCard的主键 -->

           <generator class="foreign">

              <param name="property">idCard</param>

           </generator>

       </id>

       <property name="name" />

       <!—指示hibernate怎么加载它的关联对象,默认根据主键加载

       constrained=”true”,表明当前主键上存在一个约束,person的主键作为外键参照了idCard

-->

       <one-to-one name="idCard" constrained="true"></one-to-one>

 

双向:值需要载IdCard里面增加

       <one-to-one name="person"></one-to-one>

指示hibernate如何加载person默认根据主键加载

one to one不会象其他映射一样,他不会改表

 

一对一外键关联(数据库加字段)多对一特例:

 

 

t_person

id    |    name   | idcard

3               10     |   100

4               容祖儿   |    200

t_idcard

id    |    cardNo

100   |   8888888888

200   |   9999999999

 

 

 

 

 

 


    <class name="com.hibernate.Person" table="t_person">

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

        <many-to-one name="idCard" unique="true" cascade="all"></many-to-one>

    </class>

 

采用<many-to-one>标签,制定多的一段的unique=true,这样就限制了多的一段得多重性唯一,通过这种手段映射一对一唯一外键关联

 

 

 

双向:

由于一对一默认按照主键关联,所以原来的one-to-one标签就不可以了,还需要加上一个属性引用,告诉从哪个属性进行关联。

<one-to-one name="person" property-ref="idCard"></one-to-one>

 

一对一唯一外键双向关联,需要在另一端(idcard)添加<one-to-one>标签,指示hibernate如何加载其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:

<one-to-one name="person" property-ref="idCard"></one-to-one>

你可能感兴趣的:(Hibernate)