日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HibernateHibernate实体关系映射——双边的多对一、一对多关系

發布時間:2024/4/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HibernateHibernate实体关系映射——双边的多对一、一对多关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙邊的多對一、一對多關系

?

???? 雙邊關系是最常見的配置。在多方有一方的引用,一方也有多方的引用。雙邊關系能夠很方便的查詢數據。下面以一個班級與學生的雙邊關系來深入學習。

?

???? 班級(clazz類)與學生(student類)為一對多關系。班級中有學生屬性,學生中有班級屬性,二者是雙邊的關系。

?

具體代碼如下:

?

Clazz類中有一個id主鍵和一個name屬性,另外還有一個List<Student>類型的集合屬性,代表該班級內的學生。班級與學生的關系是一對多關系,這里使用了@OneToMany配置,并用mappedBy屬性配置與該List<Student>屬性對應的是Student類中的clazz屬性。

?

Clazz.java

?

package com.lmb.hibernate.bean;import java.util.ArrayList; import java.util.List;import javax.persistence.*;@Entity @Table(name="tb_clazz") public class Clazz {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;@OneToMany(mappedBy = "clazz")private List<Student> students = new ArrayList<Student>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;} }


?

??? 雙邊關系中,控制權一般交給多方,因此這里的@OneToMany沒有哦誒之數據庫的外鍵列,而只配置了一個mappedBy屬性,值為clazz,告訴hibernate,配置信息要到Student類的clazz屬性中找。

?

? Student類中有一個id主鍵以及name姓名、sex性別兩個普通屬性,還有一個Clazz類型的屬性clazz,代表所在的班級。該屬性與Clazz中的List<Student>集合屬性是對應的。從邏輯上來講,某student的clazz屬性為某clazz,該clazz的List<Student>中必定還有改student。配置了mappedBy后,hibernate能自動維護這種關系。

?

?? Student與Clazz是一對多的關系,一對多使用@ManyToOne配置,另外用@JoinColumn配置關聯的列名。這里用tb_student表的class_id列于tb_class的id主鍵列連接。這里同時配置了級聯保存類型為PERSIST,創建student時,會自動將clazz也寫進數據庫。

?

student.java

?

package com.lmb.hibernate.bean;import javax.persistence.*;@Entity @Table(name="tb_student") public class Student {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;private String sex;@ManyToOne(cascade = {CascadeType.PERSIST},fetch = FetchType.EAGER)@JoinColumn(name="class_id")private Clazz clazz;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Clazz getClazz() {return clazz;}public void setClazz(Clazz clazz) {this.clazz = clazz;} }


注意:@JoinColumn配置了外鍵列,這里把控制權交給了多方,也可以交給一方。當一方控制時,一方的配置同單邊的一對多關系配置完全相同。

?

??? 將Clazz與Studet實體類配置到hibernate配置文件中去。

?

hibernate.cfg.xml

?

<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=UTF-8</property><property name="connection.username">lmb</property><property name="connection.password">lmb</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><mapping class="com.lmb.hibernate.bean.Person" /><mapping class="com.lmb.hibernate.bean.Email" /><mapping class="com.lmb.hibernate.bean.Clazz" /><mapping class="com.lmb.hibernate.bean.Student" /></session-factory></hibernate-configuration>


?

??? 雙邊關系使用起來比較方便,查詢或者使用時可以從任意一方訪問到另一方。不過雙邊關系也不是任何時候都適用的。如果多方的數據量比較大,比如幾千條幾萬條,設置一方的一對多映射可能是個隱患。比如,不小心執行了getStudent().size(),程序會加載這幾千條幾萬條的子數據,造成巨大的IO開支,影響到程序的運行效率。這種情況下設置雙邊關系是不明智的,應該取消一方的一對多映射,不要使用getStudent().size()來統計子數據,而改用執行select count(s) from Student s查詢語句的方式統計個數。

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的【HibernateHibernate实体关系映射——双边的多对一、一对多关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。