1. 其实本身hibernate就不是通过数据库的主外键关系去作的关联?(只是一般情况都比较正常:即要关联肯定就是有主外键关系的,所以看上去是数据库建立了主外键关系,hibernate才正常关联,其实不是这样的,不管数据库是否设置了外键引用,hibernate都可以配置正确的关联关系。)
2. Hibernate默认的关联是“主键加载”方式,即默认会在关联关系的配置上加上:constrained=“true”。
<hibernate-mappingpackage="entity">
<class name="Book" table="tbl_book">
<id name="id" column="b_id">
<generator class="native" />
</id>
<property name="author" column="b_author"/>
<property name="price" column="b_price"/>
<many-to-onename="type" class="BookType"column="b_title" lazy="false" constrained="true"></many-to-one>
</class>
</hibernate-mapping>
3. constrained=“true”并不是指做关联的列一定是主键,如上面的配置:并不是说b_title列一定要去匹配BookType所映射的表的主键列。constrained=“true”的真正含义是指去关联对应的类(如这里的BookType)的hibernate映射文件中<id>…</id>节点配置的列。一般我们在<id>…</id>节点中都会是配置的ID列,所以一般会去关联ID。
4. 如果我们不想改变默认的主键加载关联方式,却又不想去关联ID,那么可以在对应的类的hibernate映射文件中更改<id>节点的配置。如:
<hibernate-mappingpackage="entity">
<class name="BookType" table="tbl_bookType">
<id name="title" column="t_title">
</id>
<property name="name" column="t_name"/>
<property name="id" column="t_id" />
</class>
</hibernate-mapping>
这个时候,2中配置的Book类的多对一关联关系就会来关联这里BookType对应表中的t_title列。
5. 另外一种自己配置关联列的方式就是不使用默认的“主键加载“方式。可以在关联关系的配置中加入: property-ref="要关联的列对应的实体属性"。如这里可配为:
<hibernate-mappingpackage="entity">
<class name="Book" table="tbl_book">
<id name="id" column="b_id">
<generator class="native" />
</id>
<property name="author" column="b_author"/>
<property name="price" column="b_price"/>
<many-to-onename="type" class="BookType"column="b_title" lazy="false" property-ref="title" ></many-to-one>
</class>
</hibernate-mapping>
那么对应的BookType的配置就不需要将<id>配为title了,如下:
<hibernate-mappingpackage="entity">
<class name="BookType" table="tbl_bookType">
<id name="id" column="t_id">
</id>
<property name="name" column="t_name"/>
<property name="title" column="t_title"/>
</class>
</hibernate-mapping>
6. 参考资料:http://hi.baidu.com/xingkongbaobei/item/7417a37330ad9112d0dcb311