1.一對一關係java
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> <class name="com.huangliusong.entity.one2one.Departments" table="departments_"> <id name="d_id" type="java.lang.Integer"> <column name="d_id"></column> <!-- 指定使用哪一個主鍵生成主鍵 使用外鍵的方式生成主鍵 --> <generator class="foreign"> <!-- property屬性指定使用當前持久化類的哪個屬性的主鍵做爲外鍵 --> <!--property屬性執行使用當前哪一個持久化的類的哪一個屬性做爲外鍵 指定當前持久化類的哪一個屬性做爲主鍵 --> <param name="property"></param> </generator> </id> <property name="d_name" type="java.lang.String"></property> <!--一對一關係 constrained="true"表示 --> <one-to-one name="mgr" class="com.huangliusong.entity.one2one.Manegers" constrained="true"></one-to-one> </class> </hibernate-mapping>
2.constrained="true"sql
表示:constrained屬性在hibernate一對一關係中會用到,hibernate文檔中是這麼寫的,constrained(約束),只能在one-to-one的映射中使用,通常在主表映射中,有外鍵的那個表,若是constrained=true,則代表存在外鍵與關聯表對應,而且關聯表中確定存在對應的鍵與其對應,另外,改選項最關鍵的是影響save和deleted前後順序,若是是增長的時候,若是constrained=true則會增長關聯表,而後增長本表,刪除的時候是先伸出本表而後刪除關聯的表app
one-to-one的單向關聯中,若是constrained=false則會在查詢的時候所有取出來,用left outer join的方式 若是constrained=true,hibernate會延遲加載sql,只會把主表查詢出來,等有用到關聯表的時候再發出sql語句去取出來spa
one-to-one的雙向關聯,必須設置constrained=true 要否則會出現重複讀數據,若是2個表中user,car 在false時候的sql語句以下.net
select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=?
刪除的時候最好刪除從表,刪除主表會先查詢下主表,在聯合查詢下。hibernate