多对一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时外建表,参照card的id
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>