Hibernate表关联-one-to-one
三种实现方式,已顾客与房间的关系为例:
0. DB代码:
??? DROP?TABLE?IF?EXISTS 'Customer';?
??? CREATE?TABLE 'Customer' (
??? 'id class="com.domain.Customer"cascade="all">
??????????????? </class>
???? </hibernate-mapping>?
???? Customer.hbm.xml:
???? <hibernate-mapping>
?????????? <class?name="com.domain.Customer"?table="Customer"?catalog="Temp">
??????????????? <id?name="id"?type="java.lang.Integer">
????????????????????? <column?name="id"?/>
????????????????????? <!--
????????????????????? <generator?class="native"cascade="all"?/>
?????????????????????? -->
????????????????????? <!--Customer的主键由Room的主键决定,可以看成是外键-->?????
????????????????????? <generator?class="foreign">
????????????????????????????? <param?name="property">room</param>
????????????????????? </generator>
????????????????????? <!--或者使用下面的方式-->
????????????????????? <generator class="increment"></generator>
??????????????? </id>???????????????
?
??????????????? <property?name="name"?type="java.lang.String">
????????????????????? <column?name="name"?not-null="true"?/>
??????????????? </property>
??????????????? <!--?many开头的是代表该表持有外键?-->
??????????????? <!--
??????????????? <many-to-one??name="rom"?class="com.domain.Room"??unique="true">
????????????????????? <column?name="customer_id"?/>
??????????????? </many-to-one>?
??????????????? -->
??????????????? <one-to-one name="rom"?class="com.domain.Room"/>
??????????????? <!--或者使用下面的方式-->
??????????????? <one-to-one name="rom"?class="com.domain.Room"constrained="true"/>
???????????? </class>
????? </hibernate-mapping>?
4. 通过关系表实现:
??? create?table room_cust(?
????????????? room_id?int?not?null,??
? ? ? ? ?? ?? cust_id?int?not?null
??? )ENGINE=InnoDB?DEFAULT?CHARSET=utf8;?
??? 配置文件:
??? <!--optional="true"的意思是只有当room_id?和?cust_id?都不为空时才在关系表里插入。这样也会插入2遍,
?????? 所以需要inverse="true"把一方设置为虚的。即不让插入到关系表中-->
??? <join?table="room_cust"?optional="true"?inverse="true">
????????????? <key?column="cust_id"/>
????????????? <many-to-one?name="room"?column="room_id"?unique="true"/>
??? </join>?
?
?