一、在java web設計中經常使用對象進行操作,在hibernate中對象集合的保存(一對多)
1需要進行如下步驟:
1) 設計數據表關系
2)引入jar包,需要注意引入數據庫connector
3)寫實體類
4)配置映射文件和hibernate.cfg.xml
2例子如下:
員工和部門的關系,多個員工屬於一個部門,一個部門有多個員工。可以在員工表上設置一個外鍵解決一對多的關系。
2.1)創建表
CREATE TABLE employee( id INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(50) NOT NULL, depid INT, FOREIGN KEY (depid) REFERENCES dept(id) ON DELETE CASCADE); CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(100));
2.2)引入jar包
2.3)寫實體類
員工類

public class Employee { private int id; private String ename; private Dept dept = new Dept(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } }
部門類

public class Dept { private int id; private String dname; private Set<Employee> employees = new HashSet<Employee>(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public Set<Employee> getEmployees() { return employees; } public void setEmployees(Set<Employee> employees) { this.employees = employees; } }
2.4)配置映射文件
部門映射文件,dept.hbm.xml
<hibernate-mapping package="com.baidu.entity"> <class name="Dept" table="dept"> <id name="id" column="id"> <generator class="native"/> </id> <property name="dname" column="dname"></property> <set name="employees" table="emploee"> <key column="depid"></key> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
注意:在配置一對多的時候,部門對員工是一對多,要配置的內容set
1)集合屬性是哪一個,employees
2)該集合屬性存儲對象對應的表,employee
3)該表的外鍵,depid
4)集合中存儲對象的類型,class=Employee
員工映射文件,employee.hbm.xml
<hibernate-mapping package="com.baidu.entity"> <class name="Employee" table="employee"> <id name="id" column="id"> <generator class="native"/> </id> <property name="ename" column="ename"></property> <many-to-one name="dept" class="Dept" column="depid"></many-to-one> </class> </hibernate-mapping>
注意:在配置多對一的時候,員工對部門是多對一。要配置的內容many-to-one
1)哪個對象要映射
2)該表哪個外鍵與對象關聯
3)映射對象的類型
全局配置hibernate.cfg.xml,可以查看之前博客hibernate開發流程
3 簡單測試
public void fun1(){ Configuration configuration = new Configuration(); configuration.configure(); SessionFactory sessionFac = configuration.buildSessionFactory(); Session session = sessionFac.openSession(); Transaction bt = session.beginTransaction(); Dept dept = new Dept(); dept.setDname("test"); Employee employee = new Employee(); employee.setEname("test3"); employee.setDept(dept); Employee employee2 = new Employee(); employee2.setEname("test4"); employee2.setDept(dept); session.save(employee); session.save(employee2); session.save(dept); bt.commit(); session.close(); sessionFac.close(); }
需要說明的是
在表中是通過外鍵來表達一對多或多對一的關系;在類中是通過對象集合來表達,例如set/list/map;在配置文件中需要注意set/list/map的配置
哪一張表有外鍵就操作該表對應那個對象進行添加另外的對象,不然會出問題。
在hibernate中想要將一個對象映射成一個外鍵字段,只有many-to-one
在使用對象進行保存時,如果想要正確保存關聯的對象時需要設置cascade屬性為“save-update”,或者“all”
實體類中如果有類對象屬性,要進行初始化,否則可能得不到正確結果。