hibernate关系映射(一对一)
一對一關聯分為外鍵關聯和主鍵關聯:外鍵關聯是指從表中存在主表的外鍵,這也是一種特殊的多對一關系;主鍵關聯是指主從表的id一致
外鍵關聯
主表:IDCard(校園卡)
從表:Student(學生)
學生類的定義和hbm文件的配置如下
1 public class Student { 2 private int id; 3 private String name; 4 //持有idcard的外鍵 5 private IDCard idCard; 6 }?可以看到 學生持有校園卡外鍵的類結構和之前多對一關系中持有年級表外鍵的類結構是一樣的,所以配置hbm的時候也可以看成學生和校園卡是多對一關系,只是多的一方現在只有一個而已
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6 <class name="com.zlt.hibernatedemo.Student" table="student"> 7 <id name="id" column="id"> 8 <generator class="increment"></generator> 9 </id> 10 11 <property name="name" type="java.lang.String"> 12 <column name="name" length="50" /> 13 </property> 14 <many-to-one name="idCard" column="idcardid" unique="true" cascade="all"></many-to-one> 15 </class> 16 17 </hibernate-mapping>?
校園卡類的定義和hbm文件的配置如下
1 public class IDCard { 2 private int id; 3 private String num; 4 private Student student; 5 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6 <class name="com.zlt.hibernatedemo.IDCard" table="idcard"> 7 <id name="id" column="id"> 8 <generator class="increment"></generator> 9 </id> 10 11 <property name="num"></property> 12 13 <one-to-one name="student"></one-to-one> 14 </class> 15 16 </hibernate-mapping>?
測試程序
1 public class HibernateTest { 2 public static void main(String[] args) { 3 Session session = HibernateFactory.currentSession(); 4 Transaction tx = session.beginTransaction(); 5 6 7 Student student = new Student(); 8 student.setName("student"); 9 10 IDCard idCard = new IDCard(); 11 idCard.setNum("109029055"); 12 13 student.setIdCard(idCard); 14 15 //student配置了級聯,存儲了student也會把關聯的idcard存儲進去 16 session.save(student); 17 // session.save(idCard); 18 19 tx.commit(); 20 session.close(); 21 22 } 23 }?
結果
?
主鍵關聯
學生
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6 <class name="com.zlt.hibernatedemo.Student" table="student"> 7 <id name="id" column="id"> 8 <generator class="increment"></generator> 9 </id> 10 11 <property name="name" type="java.lang.String"> 12 <column name="name" length="50" /> 13 </property> 14 <one-to-one name="idCard" cascade="all"></one-to-one> 15 </class> 16 17 </hibernate-mapping>?
校園卡
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping > 6 <class name="com.zlt.hibernatedemo.IDCard" table="idcard"> 7 <id name="id" column="id"> 8 <generator class="foreign"> 9 <param name="property">student</param> 10 </generator> 11 </id> 12 13 <property name="num"></property> 14 15 <!-- 若constrained=true,則表明存在外鍵與關聯表對應,且關聯表中肯定存在對應的鍵與其對應。--> 16 <one-to-one name="student" cascade="all" constrained="true"></one-to-one> 18 </class> 19 20 </hibernate-mapping>?
測試程序
1 public class HibernateTest { 2 public static void main(String[] args) { 3 Session session = HibernateFactory.currentSession(); 4 Transaction tx = session.beginTransaction(); 5 6 7 Student student = new Student(); 8 student.setName("student"); 9 10 IDCard idCard = new IDCard(); 11 idCard.setNum("109029055"); 12 13 14 //必須執行此語句 15 idCard.setStudent(student); 16 17 session.save(idCard); 18 19 tx.commit(); 20 session.close(); 21 22 } 23 }?
結果
?
?
constrained(one-to-one):
constrained默認值為false
constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外鍵的那個表)。如果constrained=true, 則表明存在外鍵與關聯表對應,并且關聯表中肯定存在對應的鍵與其對應, 另外該選項最關鍵的是影響save和delete的先后順序。例如增加的時候,如果constainted=true,則會先增加關聯表,然后增加本表。 刪除的時候反之。
one-to-one的單向關聯中,如果constrained=false,則會在查詢時就全部取出來,用left outer join的方式。如果constrained=true,hibernate即會延遲加載sql,只把主表的查出來,等有用到關聯表的再發sql取。
one-to- one的雙向關聯中,必須設置constrained=true,要不然會有重復數據讀,如2個表user,car;在位false時sql如 下: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=? 刪除的時候最好刪除從表,刪除主表會先查詢下主表,在聯合查詢下
轉載于:https://www.cnblogs.com/zanglitao/p/3817425.html
總結
以上是生活随笔為你收集整理的hibernate关系映射(一对一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MANIFEST.MF文件全面解析
- 下一篇: Android中的ContentValu