所需工具與前文一致!java
第一部份內容:基本類型的一對多(one to many)mysql
以部門表與員工表爲例:sql
目錄結構:數據庫
hibernate.cfg.xml內容session
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 基礎配置(必須的配置) --> 8 <!-- 配置數據庫的驅動類 --> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <!-- 配置數據庫的別名 --> 11 <!-- 什麼是別名?你們都知道hibernate一個重要的優勢是能夠跨數據庫使用,實現這點的緣由就在這裏,hibernate爲每種常見的數據庫都 12 實現了特定的sql語句,好比就分頁來講,mysql就是limit語句,而oracle就是噁心的多個select嵌套在一塊兒,可是hibernate自己不 13 能識別數據庫的類型,在這裏咱們經過設置別名來告訴hibernate使用什麼數據庫的語句來實現 14 不一樣數據庫的別名分別是什麼? 15 hibernate的包裏有一個是經常使用配置文件,從這裏能夠查到 16 Hiberante開發包__hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties 17 --> 18 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 19 <!-- 配置數據庫的url地址 --> 20 <property name="hibernate.connection.url">jdbc:mysql:///test</property> 21 <!-- 配置數據庫的用戶名 --> 22 <property name="hibernate.connection.username">root</property> 23 <!-- 配置數據庫的密碼 --> 24 <property name="hibernate.connection.password">root</property> 25 26 <!-- 非必須配置 --> 27 <!-- 是否在控制檯打印sql語句,建議開發時打開,發佈後關閉 --> 28 <property name="show_sql">true</property> 29 <!-- 格式化控制檯打印的sql語句 --> 30 <!--<property name="format_sql">true</property> --> 31 <!-- hibernate有兩種開發流程,一個是先在數據庫裏建好庫,建好表,再寫對應的實體類,與對應關係。另外一種是按需求直接寫實體類與對應關係,再經過hibernate自動 32 生成對應的數據庫裏的表。若是想自動生成表就要配置這個hbm2ddl.auto這個屬性了,這個屬性有好幾個值,通常用update,其他的查文檔吧 33 --> 34 <property name="hbm2ddl.auto">update</property> 35 36 <!-- 添加映射文件 --> 37 <!-- <mapping resource="cn/kiwifly/entity/User.hbm.xml"/> --> 38 </session-factory> 39 </hibernate-configuration>
兩個實體類:oracle
Department.java app
package cn.kiwifly.entity; import java.util.HashSet; import java.util.Set; public class Department { private Integer id; private String name; private Set<Employee> employees = new HashSet<>(); 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 Set<Employee> getEmployees() { return employees; } public void setEmployees(Set<Employee> employees) { this.employees = employees; } public String toString() { return "Department [id=" + id + ", name=" + name + ", employees=" + employees + "]"; } }
Employee.javaeclipse
package cn.kiwifly.entity; public class Employee { private Integer id; private String name; private Integer age; private Department department; public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String toString() { return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", department=" + department.getName() + "]"; } }
兩個實體類的配置文件:工具
department.hbm.xmlthis
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.kiwifly.entity"> <class name="Department" table="t_department"> <id name="id" column="id" type="integer"> <generator class="native" /> </id> <property name="name" column="name" type="string"/> <set name="employees" table="t_employee" inverse="true"> <key column="department_id" /> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.kiwifly.entity"> <class name="Employee" table="t_employee"> <id name="id" column="id" type="integer"> <generator class="native" /> </id> <property name="name" column="name" type="string" /> <property name="age" column="age" type="integer" /> <many-to-one name="department" column="department_id" class="Department" /> </class> </hibernate-mapping>
hibernate 一對多映射格式
類型 |
特色 |
映射格式 |
Set |
無序,不重複 |
<set name=」主表中一對多的屬性「 table=」集合表」> <key column=」集合表外鍵」 /> <element type=」字段類型」 column=」字段名」> </set> |
List |
有序,可重複 |
<list name=」主表中一對多的屬性「 table=」集合表」> <key column=」集合表外鍵」 /> <list-index column=」排序序列」/> <element type=」字段類型」 column=」字段名」> </list> |
Array |
有序,可重複(同List) (因不能動態增加,因此不經常使用) |
<array name=」主表中一對多的屬性「 table=」集合表」> <key column=」集合表外鍵」 /> <list-index column=」排序序列」/> <element type=」字段類型」 column=」字段名」> </array> (與List基本同樣) |
Bag |
有序,可重複 (hibernate特有對象) |
<bag name=」主表中一對多的屬性「 table=」集合表」> <key column=」集合表外鍵」 /> <element type=」字段類型」 column=」字段名」> </bag> (與Set基本同樣) |
Map |
鍵值對,無序,Key不可重複 |
<map name=」主表中一對多的屬性「 table=」集合表」> <key column=」集合表外鍵」 /> <map-key type=」類型」 column=」鍵字段」></map-key> <element type=」字段類型」 column=」字段名」> </map> |
一些細節問題:
一、寫類的toStirng()方法的時候要注意,若是隻是有eclipse的快捷鍵複寫,可能會出現棧溢出的異常,由於eclipse的複寫只是寫了類名,由於這裏的相互引用會出現死循環
二、以上重點在set的映射,其他的都是在其基礎上映射的
三、List與Array與Set相比多了一個list-index屬性,就是這個屬性來讓list變的有序,這麼就引出一個問題;數據庫如何保證數據的有序性哪?
hibernate的做法:設置一個索引字段;用以保存順序;
四、set有兩個重要的屬性inverse與cascade這裏沒說,但很重要,有不少博客說的很詳細,能夠看看