不同樊响
请访问主站:http://heyday.blogcn.com
[导入][AppFuse] AppFuse使用手记--一对多(六) [原]
先说明一下,单表关系AppFuse默认生成的代码没问题的,CRUD和界面显示都非常正确,简直可以直接发布。一对多还有些小小的问题,需要手工实现部分代码。
1。先参考
[AppFuse] AppFuse使用手记--试例(二) [原]
生成POJO和其它源文件。
2。修改web.xml,打开lazyLoadingFilter配置,AppFuse原本是支持的,只是默认注释调了,如果没有打开,会报如下错误:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
3。界面显示显示列表时,一对多的列默认是不显示的,我们需要手工增加display部分。
1
<
display:column
property
="companyType.typeName"
sortable
="true"
titleKey
="companyType.typeName"
/>
4。新增和修改时,页面会出现错误,显示不出来,看看JSP页面,AppFuse也要求我们手工修改:
1
<!--
todo: change this to read the identifier field from the other pojo
-->
2
<
s:select
name
="company.companyType.typeId"
list
="companyTypeList"
listKey
="typeId"
listValue
="typeName"
></
s:select
>
错误原因主要是因为需要companyTypeList不存在,我们可在Action里实现getCompanyTypeList方法。
1
public
class
CompanyAction
extends
BaseAction
implements
Preparable
{
2
private
GenericManager
<
Company, Long
>
companyManager;
3
private
GenericManager
<
CompanyType, Long
>
companyTypeManager;
4
private
List companies;
5
private
Company company;
6
private
Long companyId;
7
8
public
void
setCompanyManager(GenericManager
<
Company, Long
>
companyManager)
{
9
this
.companyManager
=
companyManager;
10
}
11
12
public
void
setCompanyTypeManager(GenericManager
<
CompanyType, Long
>
companyTypeManager)
{
13
this
.companyTypeManager
=
companyTypeManager;
14
}
15
16
public
List getCompanies()
{
17
return
companies;
18
}
19
20
public
List getCompanyTypeList()
{
21
return
companyTypeManager.getAll();
22
}
23
24
25
}
这样页面就可以显示对应的下拉列表了。
5。CRUD中,当Update一对多一列时,会出现错误:
identifier of an instance of com.reda.app.model.CompanyType was altered from 11 to 1; nested exception is org.hibernate.HibernateException: identifier of an instance of com.reda.app.model.CompanyType was altered from 11 to 1
在网上找了找,错误的原因主要是因为Action在开始时,会持久化对象,在组装数据时,会用新数据替换旧数据,如果被替换的是持久化对象,在替换子对象关系时,会检查到子对象的Id被强制修改的错误,而持久化对象的Id值是不能被更改的。
debug时,发现在Update时,会调用prepare先持久化,注释调这部分,就可以了。
1
/** */
/**
2
* Grab the entity from the database before populating with request parameters
3
*/
4
public
void
prepare()
{
5
if
(getRequest().getMethod().equalsIgnoreCase(
"
post
"
))
{
6
//
prevent failures on new
7
String companyId
=
getRequest().getParameter(
"
company.companyId
"
);
8
//
if (companyId != null && !companyId.equals("")) {
9
//
company = companyManager.get(new Long(companyId));
10
//
}
11
}
12
}
文章来源:
http://heyday.blogcn.com/diary,15301923.shtml
posted on 2008-05-04 20:57
不同樊响
阅读(718)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 23
文章 - 0
评论 - 1
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔档案
(23)
2008年5月 (10)
2005年12月 (2)
2005年11月 (1)
2005年10月 (1)
2005年9月 (1)
2005年8月 (1)
2005年7月 (1)
2005年6月 (5)
2005年4月 (1)
搜索
最新评论
1. re: [导入][AppFuse] AppFuse使用手记--试例(二) [原]
最近研究appfuse,出了点问题,看到你的博客,很有帮助,谢谢~
--tony chan
阅读排行榜
1. [导入][AppFuse] AppFuse使用手记--Display Tag 分页(九) [原](1153)
2. [导入][AppFuse] AppFuse使用手记--试例(二) [原](865)
3. [导入][AppFuse] AppFuse使用手记--一对多(六) [原](718)
4. [导入][AppFuse] AppFuse使用手记--目录结构(三) [原](708)
5. [导入][AppFuse] AppFuse使用手记--DWR(十) [原](694)
评论排行榜
1. [导入][AppFuse] AppFuse使用手记--试例(二) [原](1)
2. [导入][AppFuse] AppFuse使用手记--目录结构(三) [原](0)
3. [导入][AppFuse] AppFuse使用手记--数据库中文问题(四) [原](0)
4. [导入][AppFuse] AppFuse使用手记--资源文件中文问题(五) [原](0)
5. [导入][AppFuse] AppFuse使用手记--一对多(六) [原](0)