BlazeDS结合Hibernate--对使用PO还是VO的思考

本文探讨了在Flex开发中使用持久对象(PO)与值对象(VO)的利弊。通过具体案例分析,展示了PO虽能减少代码量但可能导致的编辑问题,而VO虽然增加了一些代码工作量,但在灵活性上更具优势。
Flex的学习也有一段时间了,AMF确实非常强大,最近在使用的就是BlazeDS,持久层使用的是Hibernate。下面就业务层直接返回PO还是返回VO讨论一下。

返回PO的代码量比返回VO的代码量要少很多的,可以避免一个繁琐的重复的代码,但是我在把PO作为返回值与Flex结合的过程中遇到了一些问题,特别是对于有3到4张表深度的关联的时候就更加觉得不方便(比如学校—学院--班级---学生,现在要列出某个学校的学生),下面拿一个简单的2张表关联的时候作为例子。

假设现在有两张表,TUser和TRole,分别是人员表和角色表,多对一关系

public class TUser implements java.io.Serializable {
private Integer userId;
private TRole TRole;
private String userName;
private String userPass;
private String userTname;
}

public class TRole implements java.io.Serializable {

private Integer roleId;
private String roleName;
private Set TUsers = new HashSet(0);

}


获得人员的hql为

from TUser as ta join fetch ta.TRole
直接将结果作为List<TUser>返回,与这两个entity对应的AS文件是

public class TUser
{

public var userId:int;
public var userName:String;
public var userPass:String;
public var userTname:String;
public var TRole:Object;

public function TUser (){
}
}

public class Roles
{
public var roleId:int;
public var roleName:String;
public var TUsers:Array;

public function Roles()
{
}
}


下面将用户名和真实姓名显示在DataGrid中,主要代码如下(中间处理返回值还是要做一定的转换的,代码就不贴出来了):

<mx:DataGrid id="admDataGrid" dataProvider="{acPageData}" 
editable="true">
<mx:columns>
<mx:DataGridColumn headerText="用户名" dataField=" userName "/>
<mx:DataGridColumn headerText="真实姓名" dataField=" userTname "/>
</mx:columns>
</mx:DataGrid>


见图:

现在要显示出管理员名称,使用
<mx:DataGridColumn headerText="真实姓名" dataField=" TRole. roleName "/>

是行不通的,[color=red]解决办法是使用DataGridColumn的labelFunction就TRole的Object转换位真正的Role类型,并且返回他的roleName[/color](不过大家可以想象一下我前面提到的学校—学院—班级—学生的例子,如果要列出学生又要分别列出班级,学院,学校的话,就比较麻烦了),

代码:

internal function parsePOAdmin(item:Object,column:DataGridColumn):String{

var roles:Roles=Roles(item.TRole);
return roles.roleName;
}

如下图:



这样貌似显示的问题解决了,但是这一列却已经无法编辑了,如果将editable设置位true,再对管理员这一列进行编辑,会发现出现一下错误:
[color=red]强制转换类型失败:无法将 "管理员" 转换为 vo.Roles,[/color]

究其原因,应该是在editor以后会调用labelFunction里面的对应方法,然后这个方法在开始的时候值是一个Object而不是String,可以进行转换,现在却已经不行了。这个问题一直无法得到解决。或许我们可以搞个自定义组件,里面有roleId和roleName,显示出roleName,在编辑的时候根据roleId找到TRole再改变roleName,然后…….麻烦


如果上面的我们使用VO,那么是一点问题也没有的,我们可以正常的显示,编辑,而且甚至我们可以在VO里面加入序号用来显示DataGrid的序号(就是grid前面的序号,好像DtadGrid里面没有这个功能,如果要在AS里实现又是比较麻烦的,Ext确实强大啊,这个功能只要一句代码就搞定了)。

当然使用VO后台代码就会多一些无谓的繁琐代码了,可是PO的问题始终解决不了,那么,你会怎么样选择呢?


(当然,这些问题也有可能有解决办法,只是我没发现,希望知道的可以说一下,呵呵)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值