浏览 3588 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-05
最后修改:2009-01-23
返回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 "/> 是行不通的,解决办法是使用DataGridColumn的labelFunction就TRole的Object转换位真正的Role类型,并且返回他的roleName(不过大家可以想象一下我前面提到的学校—学院—班级—学生的例子,如果要列出学生又要分别列出班级,学院,学校的话,就比较麻烦了), 代码: internal function parsePOAdmin(item:Object,column:DataGridColumn):String{ var roles:Roles=Roles(item.TRole); return roles.roleName; }如下图: 这样貌似显示的问题解决了,但是这一列却已经无法编辑了,如果将editable设置位true,再对管理员这一列进行编辑,会发现出现一下错误: 强制转换类型失败:无法将 "管理员" 转换为 vo.Roles, 究其原因,应该是在editor以后会调用labelFunction里面的对应方法,然后这个方法在开始的时候值是一个Object而不是String,可以进行转换,现在却已经不行了。这个问题一直无法得到解决。或许我们可以搞个自定义组件,里面有roleId和roleName,显示出roleName,在编辑的时候根据roleId找到TRole再改变roleName,然后…….麻烦 如果上面的我们使用VO,那么是一点问题也没有的,我们可以正常的显示,编辑,而且甚至我们可以在VO里面加入序号用来显示DataGrid的序号(就是grid前面的序号,好像DtadGrid里面没有这个功能,如果要在AS里实现又是比较麻烦的,Ext确实强大啊,这个功能只要一句代码就搞定了)。 当然使用VO后台代码就会多一些无谓的繁琐代码了,可是PO的问题始终解决不了,那么,你会怎么样选择呢? (当然,这些问题也有可能有解决办法,只是我没发现,希望知道的可以说一下,呵呵) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-08
给你一些提示, 自己去钻研:
1 你的 Actionscript VO。 TRole 需定义成 Role Object 不是 Object 2.学习使用RemoteClass |
|
返回顶楼 | |
发表时间:2008-11-08
恩,好的,谢谢
|
|
返回顶楼 | |
发表时间:2008-11-09
呵呵,其实你看看我的代码就知道我的和你没什么区别了,我的意思是你返回的对象有关联的时候,比如你的Produment还有另外的一个对象,
public Produment(String name,int age,double height,TRole trole){ this.name = name; this.age = age; this.height = height; this.trole=trole; } 这时候你要显示出trole里面的name属性,应该要使用labelFunction,可是这样编辑这一列会出问题的,你可以试试 |
|
返回顶楼 | |
发表时间:2009-03-16
blazeDS如何解决延迟加载?
|
|
返回顶楼 | |
发表时间:2009-03-16
我记得论坛里有篇帖子里说,有个什么框架可以解决hibernate的延迟加载问题,去搜搜。
目前我的应用都是在返回之前全部准备好了数据,对于不需要的数据setStudent(null);这样他就不会发生延迟加载了,其实我的项目中本身就是用这种方式,特别是json转换的时候,所以没有延迟加载的问题 |
|
返回顶楼 | |