1.One2One 主键单向关联
两个实体id保持相同,可避免多余字段创建
维护方 主键 采用foreign 生成器,并且使用one-to-one 标签
constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true, 则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。 删除的时候反之。
one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
维护方 配置
<classname="Person"table="t_person">
<idname="id"column="id"type="java.lang.Integer">
<generatorclass="foreign">
<paramname="property">idcard</param>
</generator>
</id>
<propertyname="name"column="name"type="java.lang.String"></property>
《
<!-- constrained 表明当前主键作为外键与t_idCard关联表对应 -->
<one-to-onename="idcard" constrained="true"></one-to-one>
</class>
非维护方配置
<classname="IdCard"table="t_idCard">
<idname="id"column="id"type="java.lang.Integer">
<generatorclass="native"></generator>
</id>
<propertyname="idCardNo"type="java.lang.String"></property>
</class>
2.One2One 主键双向关联
主键双向关联和单向配置差不多,主要区别是在非维护方增加one-to-one 标签就行。
维护方 配置
<classname="Person"table="t_person">
<idname="id"column="id"type="java.lang.Integer">
<generatorclass="foreign">
<paramname="property">idcard</param>
</generator>
</id>
<propertyname="name"column="name"type="java.lang.String"></property>
《
<!-- constrained 表明当前主键作为外键与t_idCard关联表对应 -->
<one-to-onename="idcard" constrained="true"></one-to-one>
</class>
非维护方配置
<classname="IdCard"table="t_idCard">
<idname="id"column="id"type="java.lang.Integer">
<generatorclass="native"></generator>
</id>
<propertyname="idCardNo"type="java.lang.String"></property>
<one-to-onename="person" ></one-to-one>
</class>