[導(dǎo)入][AppFuse] AppFuse使用手記--一對多(六) [原]
先說明一下,單表關(guān)系A(chǔ)ppFuse默認(rèn)生成的代碼沒問題的,CRUD和界面顯示都非常正確,簡直可以直接發(fā)布。一對多還有些小小的問題,需要手工實現(xiàn)部分代碼。
1。先參考 [AppFuse] AppFuse使用手記--試?yán)ǘ?[原] 生成POJO和其它源文件。
2。修改web.xml,打開lazyLoadingFilter配置,AppFuse原本是支持的,只是默認(rèn)注釋調(diào)了,如果沒有打開,會報如下錯誤:
3。界面顯示顯示列表時,一對多的列默認(rèn)是不顯示的,我們需要手工增加display部分。
4。新增和修改時,頁面會出現(xiàn)錯誤,顯示不出來,看看JSP頁面,AppFuse也要求我們手工修改:
錯誤原因主要是因為需要companyTypeList不存在,我們可在Action里實現(xiàn)getCompanyTypeList方法。
5。CRUD中,當(dāng)Update一對多一列時,會出現(xiàn)錯誤:
在網(wǎng)上找了找,錯誤的原因主要是因為Action在開始時,會持久化對象,在組裝數(shù)據(jù)時,會用新數(shù)據(jù)替換舊數(shù)據(jù),如果被替換的是持久化對象,在替換子對象關(guān)系時,會檢查到子對象的Id被強(qiáng)制修改的錯誤,而持久化對象的Id值是不能被更改的。
debug時,發(fā)現(xiàn)在Update時,會調(diào)用prepare先持久化,注釋調(diào)這部分,就可以了。
文章來源: http://heyday.blogcn.com/diary,15301923.shtml
1。先參考 [AppFuse] AppFuse使用手記--試?yán)ǘ?[原] 生成POJO和其它源文件。
2。修改web.xml,打開lazyLoadingFilter配置,AppFuse原本是支持的,只是默認(rèn)注釋調(diào)了,如果沒有打開,會報如下錯誤:
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)
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。界面顯示顯示列表時,一對多的列默認(rèn)是不顯示的,我們需要手工增加display部分。
1
<display:column property="companyType.typeName" sortable="true" titleKey="companyType.typeName"/>

4。新增和修改時,頁面會出現(xiàn)錯誤,顯示不出來,看看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>

2

錯誤原因主要是因為需要companyTypeList不存在,我們可在Action里實現(xiàn)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
}
這樣頁面就可以顯示對應(yīng)的下拉列表了。


2

3

4

5

6

7

8



9

10

11

12



13

14

15

16



17

18

19

20



21

22

23

24



25

5。CRUD中,當(dāng)Update一對多一列時,會出現(xiàn)錯誤:
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
在網(wǎng)上找了找,錯誤的原因主要是因為Action在開始時,會持久化對象,在組裝數(shù)據(jù)時,會用新數(shù)據(jù)替換舊數(shù)據(jù),如果被替換的是持久化對象,在替換子對象關(guān)系時,會檢查到子對象的Id被強(qiáng)制修改的錯誤,而持久化對象的Id值是不能被更改的。
debug時,發(fā)現(xiàn)在Update時,會調(diào)用prepare先持久化,注釋調(diào)這部分,就可以了。
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
}


2

3

4



5



6

7

8

9

10

11

12

文章來源: http://heyday.blogcn.com/diary,15301923.shtml