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):那个弹出层的代码,每个弹出框的确定按钮,都属于他前面一个页面的(即调用他的那个页面),所以在这个确定按钮中,可以获得她前面那个页面的一切属性