在hibernate中当遇到一个po在某一个po中作为属性存在时候,这个应该是一种关系,活动和员工,活动自身,存在以下关系.
3.1多对一关系,活动本身是自关联的,同时他和员工是个多对一的关系.一个员工可能创建多个活动.
<many-to-one
name="staff"
class="cattsoft.sxms.ejb.po.Staff"
not-null="true" >
<column name="CREATE_STAFF_ID" /
</many-to-one>
多对一关系,name属性指向一表的持久化类名称,class属性表示他的存储路径
<column name>中的name属性表示一方向表在多方向po中的外键属性.也就是两个表的关联属性.
3.2自关联关系,当为一对多关系的时候一方向的设置,由于一方向要存储多方向的对象集合所以设置的时候要用到<set>
<set
name="tasks"
lazy="true"
inverse="true"
>
<key>
<column name="PARENT_TASK_ID" />//表示一方向表的主键
</key>
<one-to-many
class="cattsoft.sxms.ejb.po.Task"//多方向的类路径
/>
</set>
<!-- bi-directional many-to-one association to Task -->
<many-to-one
name="task"
class="cattsoft.sxms.ejb.po.Task"
not-null="true"
>
<column name="PARENT_TASK_ID" />//表示外键名称
</many-to-one>
这个是设置了Task的自关联关系.
<o:p> </o:p>
<o:p> </o:p>
1. 在DAO中我们利用po查询信息的时候利用拼凑hql语句的方法来进行实现
String hql = " from Task as a where ";
<o:p> </o:p>
if ((task.getTaskId() != null) && (task.getTaskId().intValue() > 0)) {
hql += ("a.taskId = " + task.getTaskId() + " and ");
}
<o:p> </o:p>
if ((task.getRemarks() != null) && (!"".equals(task.getRemarks()))) {
hql += ("a.remarks='" + task.getRemarks() + "' and ");
}
<o:p> </o:p>
如果要利用当前po中的一个对象来进行查询的时候,为什么会出现一个对象呢?那是因为我们存在多对一的关系.
这个是活动执行计划表的映射文件的一部分
<o:p> </o:p>
活动执行计划表和活动表是多对一的关系.
<many-to-one
name="task"
class="cattsoft.sxms.ejb.po.Task"
not-null="true"
>
<column name="TASK_ID" />
</many-to-one>
<o:p> </o:p>
当我们要利用活动编号来进行查询活动执行计划的相关信息的时候!需要像以下方式来构造hql语句.
<o:p> </o:p>
if ((taskExecPlan.getTask()!= null) &&
(!"".equals(taskExecPlan.getTask().getTaskId()))) {
hql += ("a.task.taskId='" + taskExecPlan.getTask().getTaskId() + "' and ");
}
不知道为什么不可以利用
taskExecPlan.getTask().getTskId()!= null
来进行判空,一这样作就立马出错,好像是空指针吧!反正是一堆红的!晕!!!