【JAVAEE學習筆記】hibernate03:多表操作,級聯練習:添加聯系人
阿新 • • 發佈:2017-06-07
row tac 默認值 rac user except pro intra com
一、一對多|多對一
1、關系表達
表中的表達
實體中的表達
orm元數據中表達
一對多
<!-- 集合,一對多關系,在配置文件中配置 --> <!-- name屬性:集合屬性名 column屬性: 外鍵列名 class屬性: 與我關聯的對象完整類名 --> <set name="linkMens" inverse="true" cascade="delete" > <key column="lkm_cust_id" ></key> <one-to-many class="LinkMan" /> </set>
多對一
<!-- 多對一 --> <!-- name屬性:引用屬性名 column屬性: 外鍵列名 class屬性: 與我關聯的對象完整類名 --> <many-to-one name="customer"column="lkm_cust_id" class="Customer" > </many-to-one>
2、操作
操作關聯屬性
//3操作 Customer c = new Customer(); c.setCust_name("傳智播客"); LinkMan lm1 = new LinkMan(); lm1.setLkm_name("黎活明"); LinkMan lm2 = new LinkMan(); lm2.setLkm_name("劉悅東"); //表達一對多,客戶下有多個聯系人 c.getLinkMens().add(lm1); c.getLinkMens().add(lm2); //表達對對對,聯系人屬於哪個客戶 lm1.setCustomer(c); lm2.setCustomer(c); session.save(c); session.save(lm1); session.save(lm2);
3、進階操作
級聯操作
<!-- 級聯操作: cascade save-update: 級聯保存更新 delete:級聯刪除 all:save-update+delete 級聯操作: 簡化操作.目的就是為了少些兩行代碼. -->
<set name="linkMens" inverse="true" cascade="delete" >
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan" />
</set>
結論: 簡化操作.一定要用,save-update,不建議使用delete.
關系維護
在保存時.兩方都會維護外鍵關系.關系維護兩次,冗余了. 多余的維護關系語句,顯然是客戶這一端在維護關系
<!-- inverse屬性: 配置關系是否維護. true: customer不維護關系 false(默認值): customer維護關系 inverse屬性: 性能優化.提高關系維護的性能. 原則: 無論怎麽放棄,總有一方必須要維護關系. 一對多關系中: 一的一方放棄.也只能一的一方放棄.多的一方不能放棄. --> <set name="linkMens" inverse="true" cascade="delete" > <key column="lkm_cust_id" ></key> <one-to-many class="LinkMan" /> </set>
二、多對多
1、關系表達
表中的表達
對象中
orm元數據
<!-- 多對多關系表達 --> <!-- name: 集合屬性名 table: 配置中間表名 key |-column:外鍵,別人引用"我"的外鍵列名 class: 我與哪個類是多對多關系 column:外鍵.我引用比人的外鍵列名 --> <!-- cascade級聯操作: save-update: 級聯保存更新 delete:級聯刪除 all:級聯保存更新+級聯刪除 結論: cascade簡化代碼書寫.該屬性使不使用無所謂. 建議要用只用save-update. 如果使用delete操作太過危險.尤其在多對多中.不建議使用. --> <set name="roles" table="sys_user_role" cascade="save-update" > <key column="user_id" ></key> <many-to-many class="Role" column="role_id" ></many-to-many> </set>
2、操作
操作關聯屬性
//3> 用戶表達關系 u1.getRoles().add(r1); u1.getRoles().add(r2); u2.getRoles().add(r1); u2.getRoles().add(r2); //4> 角色表達關系 r1.getUsers().add(u1); r1.getUsers().add(u2); r2.getUsers().add(u1); r2.getUsers().add(u2); //5> 調用Save方法一次保存 session.save(u1); session.save(u2); session.save(r1); session.save(r2);
3、操作進階
inverse屬性
<!-- 使用inverse屬性 true: 放棄維護外鍵關系 false(默認值):維護關系 結論: 將來在開發中,如果遇到多對多關系.一定要選擇一方放棄維護關系. 一般誰來放棄要看業務方向. 例如錄入員工時,需要為員工指定所屬角色. 那麽業務方向就是由員工維護角色. 角色不需要維護與員工關系.角色放棄維護 --> <set name="users" table="sys_user_role" inverse="true" > <key column="role_id" ></key> <many-to-many class="User" column="user_id" ></many-to-many> </set>
級聯屬性
<!-- cascade級聯操作: save-update: 級聯保存更新 delete:級聯刪除 all:級聯保存更新+級聯刪除 結論: cascade簡化代碼書寫.該屬性使不使用無所謂. 建議要用只用save-update. 如果使用delete操作太過危險.尤其在多對多中.不建議使用. --> <set name="roles" table="sys_user_role" cascade="save-update" > <key column="user_id" ></key> <many-to-many class="Role" column="role_id" ></many-to-many> </set>
三、練習:添加聯系人
servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1> 獲得參數並封裝LinkMan對象中 LinkMan lm = new LinkMan(); try { BeanUtils.populate(lm, request.getParameterMap()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } //2> 調用Service保存LinkMan對象 lms .save(lm); //3> 重定向到LinkMan的列表(404) response.sendRedirect(request.getContextPath()+"/ListLinkManServlet"); }
service:
private CustomerDao cd =new CustomerDaoImpl(); private LinkManDao lmd = new LinkManDaoImpl(); public void save(LinkMan lm) { //打開事務 HibernateUtils.getCurrentSession().beginTransaction(); try { //1 根據客戶id獲得客戶對象 Long cust_id = lm.getCust_id(); Customer c = cd.getById(cust_id); //2 將客戶放入LinkMan中表達關系 lm.setCustomer(c); //3 保存LinkMan lmd.save(lm); } catch (Exception e) { e.printStackTrace(); //回滾事務 HibernateUtils.getCurrentSession().getTransaction().rollback(); } //提交事務 HibernateUtils.getCurrentSession().getTransaction().commit(); }
dao:
public void save(LinkMan lm) { //1 獲得session Session session = HibernateUtils.getCurrentSession(); session.save(lm); }
【JAVAEE學習筆記】hibernate03:多表操作,級聯練習:添加聯系人