[导入][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)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(2)

随笔档案(23)

搜索

最新评论

阅读排行榜

评论排行榜