Hibernate 4.1 を使用する Spring 3.1 MVC アプリでは、シナリオは次のとおりです。
- ウェブページにレコードのリストが表示され、ユーザーはチェックボックスでレコードを選択できます
- POST で、選択したレコードが削除されます
この機能は他の場所にも表示されるため、同様のコードの複製を避けるためにジェネリックを使用したいと考えています。
ロジックは次のとおりです。
- GET では、休止状態のオブジェクトとブール値を保持するジェネリックを使用してリストを作成し、そのリストをモデルに追加しています
- POST でモデルからそのリストを取得し、選択したレコードを削除するためにそれをサービスに渡します
コードは次のとおりです。
/* list item */
public class SelectionListItem<T> {
/* holds the hibernate object */
private T item;
/* whether the record is selected */
private boolean selected;
public SelectionListItem() {
}
public SelectionListItem(T item, boolean selected) {
this.item = item;
this.selected = selected;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
/* list that holds the records */
public class SelectionList<T> {
private List<SelectionListItem<T>> list = new ArrayList<SelectionListItem<T>>();
public SelectionList() {
}
public List<SelectionListItem<T>> getList() {
return list;
}
public void setList(List<SelectionListItem<T>> list) {
this.list = list;
}
}
/* Controller for GET */
@RequestMapping(value = "/xxx", method = RequestMethod.GET)
public String functionGET(Model model) {
// Retrieve data from database and prepare the list
SelectionList<MyDomainObject> selectionList = someService.getRecordsAndPrepareList();
// Add command object to model
model.addAttribute("selectionListCommand", selectionList);
return "xxx";
}
/* Service that retrieves the records and prepares the list */
public SelectionList<MyDomainObject> getRecordsAndPrepareList() {
List<MyDomainObject> result = sessionFactory.getCurrentSession().createCriteria(MyDomainObject.class).list();
SelectionList<MyDomainObject> selectionList = new SelectionList<MyDomainObject>();
for (MyDomainObject item : result) {
SelectionListItem<MyDomainObject> e = new SelectionListItem<MyDomainObject>(item, false);
selectionList.getList().add(e);
}
return selectionList;
}
/* Controller for POST */
@RequestMapping(value = "/xxx", method = RequestMethod.POST)
public String functionPOST(
@ModelAttribute("selectionListCommand") SelectionList<MyDomainObject> selectionListCommand,
BindingResult result, Model model) {
// Delete record
someService.deleteSelectedRecords(selectionListCommand);
return "xxx;
}
/* Service that deletes the selected records*/
public void deleteSelectedRecords(SelectionList<MyDomainObject> selectionList) {
for (SelectionListItem<MyDomainObject> item : selectionList.getList()) {
if (item.isSelected()) {
sessionFactory.getCurrentSession().delete(item.getItem());
}
}
}
GET 要求で、SelectionList が正しく取り込まれ、「T アイテム」のタイプは「MyDomainObject」になります。
POST では、「T アイテム」のタイプは「java.lang.Object」であり、「sessionFactory.getCurrentSession().delete(item.getItem())」が実行されると、「org.hibernate.MappingException: Unknown」が発生します。エンティティ: java.lang.Object"
誰かがそれを引き起こしている原因とそれを解決する方法を説明できますか?
前もって感謝します。