当一个类的主键即当主键又当外键,就是随着既是主键又是外键的那个表的ID变化而变化,用forgien
主键外键同一个的那个类用foreign
public class Person { private int id; private String name; private IdCard idCard;//体现一对一的关系。保存映射类的实例对象。 //。。。 } //Person.hbm.xml <hibernate-mapping> <class name="domain1.Person" table="person"> <id name="id" column="id"> <!-- 重点在这里。主键生成策略 因为主键跟外键是同一个,所以直接在这里申明该主键就是外键,并且指向了idCard这个类 --> <!-- 使用外键的方式生成主键 --> <generator class="foreign"> <!-- property属性指定使用当前持久化类的哪一个属性的主键作为外键 --> <param name="property">idCard</param> </generator> </id> <!-- 一些常规属性 --> <property name="name"></property> <!--由于在申明主键的时候已经将关系写清楚了,所以在这里没有column这个属性。按平常的习惯,我们会在这里写上column="数据库中外键字段属性名称。"--> <!--constrained属性:就是表明我们的主键当外键使用了。 这个属性两个作用,一是通知这种对应关系在上面已经写过了,所以这里才不需要写column,二是表明这种关系是什么,也就是主键当外键。 其实还有一个级联关系的作用,这里不做多说明,具体会在这章之后一起讲解,不然会让人感觉很混乱。--> <one-to-one name="idCard" constrained="true"></one-to-one> </class><id name="id" column="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id>
以下是标签的含义
<id name="id">:设置“id”为本类的主键
<generator class="foreign">:把这个主键也当成外键
<param name="property">:指定作为哪个类的主键当成自己的外键,就是把idCard这个类里的id作为主键,而这个id又是本类的外键,且写的是本类里引用类的属性名;
constrained="true"这个说明本类的主键当外键了,必须加上
表示:constrained属性在hibernate一对一关系中会用到,hibernate文档中是这么写的,constrained(约束),只能在one-to-one的映射中使用,一般在主表映射中,有外键的那个表,如果constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应,另外,改选项最关键的是影响save和deleted先后顺序,如果是增加的时候,如果constrained=true则会增加关联表,然后增加本表,删除的时候是先伸出本表然后删除关联的表
one-to-one的单向关联中,如果constrained=false则会在查询的时候全部取出来,用left outer join的方式 如果constrained=true,hibernate会延迟加载sql,只会把主表查询出来,等有用到关联表的时候再发出sql语句去取出来