erp專案經驗總結
1. 關於hbm表和Action模型注入
模型注入
補充:不論多對一,一對多,都是要考慮,建立這個成員屬性到底是要給誰賦值(ID),是哪個ID就把表中對應的鍵名,寫上即可。
[1]:首先建立了xxxAction之後,屬於本Actioin的xxx model模型,以及xxxService要首先注入
[2]:然後是再考慮與這個Action有關的前端頁面有沒有用到與這個xxx模型相關聯的表模型(多對一,一對多,多對多等)中的資料,如果用到了,那麼就需要注入這個模型,來接收資料。
[3]:同[2]類似,如果後端Action中,需要用到哪個屬性來接收前端傳過來的資料,但是這個Action中的模型或者其他模型沒有能接收他的,那麼新建一個
Hbm對映
首先是資料庫建模時的模型,指明的多對一,一對多,多對多和一對一的關係。 (1)多對一:
在多的一端的模型中新建一的一端的屬性,然後加入set,get方法。多的一段對映檔案中:將原一的一端的ID去掉,然後<!--
指定多對一的關係
name:多的一端(emp)的類中的一的類(team)的屬性名
column:建表後多的一端(t_emp)中的外來鍵[也就是一的一端的主鍵ID]
-->
<many-to-one name="team"column="t_id"></many-to-one
本模型中建立另一端的模型成員屬性,在給另一端這個模型物件賦值時,!!!!!!!!!如果是多對一這種關係,是給本模型中的外來鍵(對應另一端的主鍵)賦值。
(2)一對多:
在一的一端的模型中新建多的一端的Set集合的屬性,然後加入set,get方法。一的一端的對映檔案中:<!--
set指定一對多的關係配置
name:在一的一端的模型類中集合的屬性名
-->
<set name="set">
<!--
key:在多的一端的表中要產生的外來鍵
column
-->
<key column="t_id"></key>
<!--
one-to-many:指定多的一端的類
class:多的一端的類在專案中的路徑
-->
<one-to-many class="com.dz.model.Emp"/>
</set>
本模型中建立另一端的模型成員屬性,在給另一端這個模型物件賦值時,!!!!!!!!!如果是一對多這種關係,是給另一端模型中的外來鍵(對應本模型中的主鍵)賦值
(3)一對一:
在 一張身份證對應一個人,在身份證一端加入人的屬性,然後在其對映檔案中(這個要注意!!要用外來鍵的方式生成主鍵)
<!-- 指定主鍵名稱,建議使用emp端的主鍵名稱 -->
<id name="cardId" column="emp_no">
<!-- 使用外來鍵的方式來生成主鍵 -->
<generator class="foreign">
<!-- 指定idCard這一端的emp屬性 -->
<param name="property">emp</param>
</generator>
</id>
<!--
指定一對一的關係
name:當前端的的另一個一的一端的屬性名稱emp
constrained:建表時帶有外來鍵約束
-->
另一個一的一端:模型中建立身份證card模型屬性:card
<!--
雙向關聯對映的一對一,從資料庫模型的箭頭指向方向來看
name:指定箭頭背向端的model屬性
-->
<one-to-one name="card"></one-to-one>
<one-to-one name="emp"constrained="true"></one-to-one>
(4)多對多:在多的一端建另一個多的一端的set集合屬性,另一個多的一端同樣也是
單端對映:
<!--
set:設定多對多的單端集合
name:在emp中集合屬性名稱
table:要產生的中間表的名稱
-->
<set name="roles" table="emp_role">
<!--
把emp表的主鍵給中間表作為外來鍵
column:當前emp表的主鍵名稱
-->
<key column="emp_no"></key>
<!--
指定emp對面端的
class:指定多的一端的類
column:指定多的一端的要給中間表的欄位名稱(role表的主鍵)
-->
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
雙向對映:與另一端配置方式一樣
<set name="emps"table="emp_role" cascade="save-update">
<key column="role_id"></key>
<many-to-many class="Emp" column="emp_no"></many-to-many>
</set>
2. 模型中何時需要建立新的屬性,然後指定對映關係。
(1) 首先兩張表A表和B表之間,如果A表需要用到B表的東西,那麼需要在模型B中建立屬性A,並在A的對映表中配置關係。如果不需要引用B的東西,但是A和B有關係,B和C有關係。A需要用到C的東西,那麼依然需要建立B然後配置對映,並在B中建立C,然後配置對映,這樣才能通過A . B . C . 屬性從而引用到C的東西
(2) 總之兩張表之間最多A→B有一個對映關係,B對A有一個對映關係。相當與他們的對映表中,兩個表各有一個配置關係,不可能再多了。
3. 自定義標籤問題
當資料庫表中需要通過數字來代表一個狀態時,必須用文字表示出來。那麼就需要在utils工具包中建立靜屬性,然後通過配置自定義標籤來輸出相對應的文字屬性。
4. 隱藏屬性
當需要用到模型表中的屬性時,但是前端表中不需要展示,那麼就用隱藏標籤來接收,如果需要傳遞回去值的話,那麼一定要配置好,用什麼來接收。
5事務管理
在一個被事務管理起來的service層,即在ApplicationContext.xml中,配置了execution(*service
等等的)這個,以及指定了方法前戳的,這裡只要方法中獲得了持久物件。那麼對於這個持久物件的增刪改查,就會自動進行儲存修改,不需要手動。
但是如果該物件(即該張表模型),中存在另一張表的 Set 模型,即關聯對映,那麼對另一張表的增刪改查,需要手動,或者在對映檔案的 Set標籤物件中加上級聯屬性,save-update,才可以同時的執行。
5. 前端頁面中,資料的問題
A頁面與B頁面
A頁面通過連結跳轉到Action中,再通過Action中的相對應的方法跳轉到B頁面
(1):只要是本次跳轉(A→Action→B),那麼方法中context.put()加入的,以及Action中建立的用於接收資料的屬性,都可以被B頁面呼叫!!!!!!!
(2):那個彈出層的程式碼,每個彈出框的確定按鈕,都屬於他前面一個頁面的(即呼叫他的那個頁面),所以在這個確定按鈕中,可以獲得她前面那個頁面的一切屬性