2011-08-04 22 views
-2

WebアプリケーションExtjs、Spring3.0、JPA、Hibernateがあります。私は1つのエンティティを持つページを検索してうまくいきましたが、昨日私はUser Entityで@manytooneを追加し、アプリケーションは動作を停止しました。 Extjs例外をスローし始めます。デバッグしようとすると、@ manytoOne関係の問題が見つかりました。誰か私にヒントを与えてくれますか?Extjs + Spring + JPA + HIbernate

@Controller 
public class BusinessCalsController { 

     @Autowired 
     private BusinessCalService businessCalService; 

     public void setBusinessCalService(BusinessCalService businessCalService) { 
      this.businessCalService = businessCalService; 
     } 

     @SuppressWarnings("unchecked") 
     @RequestMapping(value="/businessCalView.do",method=RequestMethod.GET) 
     public @ResponseBody Map<String,? extends Object> view(HttpServletRequest request, HttpServletResponse response) throws Exception { 
      try{ 
       String strStart = request.getParameter("start"); //start index 
       String strLimit = request.getParameter("limit"); //limit record num 
       String strSort = request.getParameter("sort"); //desc or asc 
       String strDir = request.getParameter("dir"); //property for sort 
       Map businessCal = (Map)businessCalService.getBusinessCalList(strStart, strLimit, strSort, strDir); 
       Map modelMap = getJSONMap((List<BusinessCal>) businessCal.get("resultSet")); 
       return modelMap; 
      } catch (Exception e) { 
       return getModelMapError("Error retrieving Machine from database."); 
      } 
      } 


     /** 
     * Generates modelMap to return in the modelAndView 
     * @param contacts 
     * @return 
     */ 
     private Map<String,Object> getJSONMap(List<BusinessCal> businessCal){ 

      Map<String,Object> modelMap = new HashMap<String,Object>(3); 
      modelMap.put("total", businessCal.size()); 
      modelMap.put("data", businessCal); 
      modelMap.put("success", true); 
      return modelMap; 
     } 

     /** 
     * Generates modelMap to return in the modelAndView in case 
     * of exception 
     * @param msg message 
     * @return 
     */ 
     private Map<String,Object> getModelMapError(String msg){ 

      Map<String,Object> modelMap = new HashMap<String,Object>(2); 
      modelMap.put("message", msg); 
      modelMap.put("success", false); 
      return modelMap; 
     } 
} 

@Service 
public class BusinessCalService { 
    @Autowired 
    private BusinessCalDAO businessCalDAO; 
    private BusinessCalJsonUtil util; 

    /** 
    * Get all contacts 
    * @return 
    */ 
    @Transactional(readOnly=true) 
    public Object getBusinessCalList(String strStart,String strLimit,String strSort, String strDir){ 
     return businessCalDAO.searchBusinessCal(strStart, strLimit, strSort, strDir); 
    } 

    /** 
    * @return the userCalDAO 
    */ 
    public BusinessCalDAO getBusinessCalDAO() { 
     return businessCalDAO; 
    } 

    /** 
    * @param userCalDAO the userCalDAO to set 
    */ 
    @Autowired 
    public void setBusinessCalDAO(BusinessCalDAO businessCalDAO) { 
     this.businessCalDAO = businessCalDAO; 
    } 

    /** 
    * Spring use - DI 
    * @param util 
    */ 
    @Autowired 
    public void setJsonUtil(BusinessCalJsonUtil util) { 
     this.util = util; 
    } 
} 

@Repository 
public class BusinessCalDAO { 

    @Autowired 
    private HibernateTemplate hibernateTemplate; 
    private boolean flag; 

    /** 
    * @return the hibernateTemplate 
    */ 
    @SuppressWarnings("unchecked") 
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate){ 
     this.hibernateTemplate = hibernateTemplate; 
    } 

    /** 
    * Get List of UsersCals from database 
    * @return list of all contacts 
    */ 
    @SuppressWarnings("unchecked") 
    public Object searchBusinessCal(String strStart,String strLimit,String strSort, String strDir) { 
     PageHibernate newPage = null; 
     BusinessCal obj = new BusinessCal(); 
     newPage = new PageHibernate("from BusinessCal", (strStart != null && !strStart.equals("null")) ? Integer.parseInt(strStart) : 0 , (strLimit != null && !strLimit.equals("null")) ? Integer.parseInt(strLimit) : 0 ,obj.getClass()); 
     return hibernateTemplate.execute(newPage); 
    } 
} 


@SuppressWarnings("serial") 
@Entity 
@Table(name="SP_BU_CALS",schema ="TAX_STG") 
public class BusinessCal implements Serializable{ 

    private BULookUp objBULookUp; 
    private Integer intID; 
    private String strBussUnitId; 

    /** 
    * @return the intID 
    */ 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "FEED_SEQ") 
    @SequenceGenerator(name="FEED_SEQ", sequenceName = "TAX_FEED.FEED_SEQ")  
    public Integer getIntID() { 
     return intID; 
    } 
    /** 
    * @param intID the intID to set 
    */ 
    public void setIntID(Integer intID) { 
     this.intID = intID; 
    } 
    /** 
    * @return the strBusinessUnitId 
    */ 
    @Column(name="BU_ID") 
    public String getStrBussUnitId() { 
     return strBussUnitId; 
    } 
    /** 
    * @param strBusinessUnitId the strBusinessUnitId to set 
    */ 
    public void setStrBussUnitId(String strBussUnitId) { 
     this.strBussUnitId = strBussUnitId; 
    } 

    /** 
    * @return the objBULookUp 
    */ 
    @ManyToOne 
    @JoinColumn(name = "BU_ID", insertable = false, updatable = false) 
    public BULookUp getObjBULookUp() { 
     return objBULookUp; 
    } 
    /** 
    * @param objBULookUp the objBULookUp to set 
    */ 
    public void setObjBULookUp(BULookUp objBULookUp) { 
     this.objBULookUp = objBULookUp; 
    } 
} 

問題BusinessCalモデルでBULookUp objBULookUpを追加したときに起動する問題。 BULookUpのコードとextjsファイルのコードを追加しましょう。

@SuppressWarnings("serial") 
@Entity 
@Table(name="SP_BU_LKUP",schema ="TAX_STG") 
public class BULookUp implements Serializable{ 

    private String strBusinessUnitID; 
    private String strBusinessUnitDescription; 
    private String strCBDCode; 
    private Integer intActive; 

    /** 
    * @return the strBusinessUnitID 
    */ 
    @Id 
    @Column(name="BU_ID") 
    public String getStrBusinessUnitID() { 
     return strBusinessUnitID; 
    } 
    /** 
    * @param strBusinessUnitID the strBusinessUnitID to set 
    */ 
    public void setStrBusinessUnitID(String strBusinessUnitID) { 
     this.strBusinessUnitID = strBusinessUnitID; 
    } 
    /** 
    * @return the strBusinessUnitDescription 
    */ 
    @Column(name="BU_DESCR") 
    public String getStrBusinessUnitDescription() { 
     return strBusinessUnitDescription; 
    } 
    /** 
    * @param strBusinessUnitDescription the strBusinessUnitDescription to set 
    */ 
    public void setStrBusinessUnitDescription(String strBusinessUnitDescription) { 
     this.strBusinessUnitDescription = strBusinessUnitDescription; 
    } 
    /** 
    * @return the strCBDCode 
    */ 
    @Column(name="CBD") 
    public String getStrCBDCode() { 
     return strCBDCode; 
    } 
    /** 
    * @param strCBDCode the strCBDCode to set 
    */ 
    public void setStrCBDCode(String strCBDCode) { 
     this.strCBDCode = strCBDCode; 
    } 
    /** 
    * @return the intActive 
    */ 
    @Column(name="ACTIVE") 
    public Integer getIntActive() { 
     return intActive; 
    } 
    /** 
    * @param intActive the intActive to set 
    */ 
    public void setIntActive(Integer intActive) { 
     this.intActive = intActive; 
    } 
} 

ExtJSの

app = function() { 

     var createForm; 
     var updateForm; 
     var ds; 
     var dataGrid; 
     var menu; 
     var updateMenuItem; 
     var createMenuItem; 
     var readMenuItem; 
     var deleteMenuItem; 
     var tb; 
     var sm; 
     var userRecord; 
     var reader; 
     var writer; 
     var proxy; 
     var pagetbUsers; 

     var getContext = function() { 

      var base = document.getElementsByTagName('base')[0]; 
      if (base && base.href && (base.href.length > 0)) { 
       base = base.href; 
      } else { 
       base = document.URL; 
      } 
      return base.substr(0, base.indexOf("/", base.indexOf("/", base.indexOf("//") + 2) + 1)); 
     }; 

     var onRowClick = function(SelectionModel,rowIndex,record) { 
      onUpdateClick() 
     }  
     return { 
      init:function() { 

      businessCalRecord = Ext.data.Record.create([ 
        {name: 'intID', type: 'int'}, 
        {name: 'strBussUnitId', type: 'string'}, 
        {name: 'intCalCount', type: 'int'}, 
        {name: 'strCalType',type: 'string'}, 
        {name: 'strCalDescription', type: 'string'}, 
        {name: 'strCountType', type: 'string'}, 
        {name: 'strCalStart', type: 'string'}, 
        {name: 'strCalEnd', type: 'string'}, 
        {name: 'strCreatedBy', type: 'string'}, 
        {name: 'tmpCreatedDate', type: 'date'}, 
        {name: 'strActive', type: 'string'}, 
        {name: 'tmpInActiveDate', type: 'string'}, 
        {name: 'strCalID', type: 'string'}, 
        {name: 'objBULookUp.strBusinessUnitID', type: 'string'} 
       ]); 

      // The new DataWriter component. 
      writer = new Ext.data.JsonWriter({ 
       encode: true, 
       writeAllFields: true 
      }); 

      // The new DataReader component. 
      reader = new Ext.data.JsonReader({ 
       totalProperty: 'total', 
       successProperty: 'success', 
       idProperty: 'intID', 
       root: 'data', 
       messageProperty: 'message' // <-- New "messageProperty" meta-data 
      }, 
      businessCalRecord); 

      proxy = new Ext.data.HttpProxy(new Ext.data.Connection({ 
       api: {read: {url:'businessCalView.do', method: 'GET'}}, 
       autoAbort: true 
      })); 

      proxy.addListener('exception', function(proxy, options, response, error, res) { 
       alert(error); 
       alert("proxy.addListener"); 
       Ext.Msg.show({ 
        title: 'ERROR', 
        msg: res.message, 
        icon: Ext.MessageBox.ERROR, 
        buttons: Ext.Msg.OK 
       }); 
      }); 

      proxy.on({ 
       "loadexception": function(proxy, options, response, error) { 
        alert(response.responseText); 
        alert("proxy.on"); 
        alert(response.status); 
        alert(response.message); 
       } 
      }); 

      // Typical Store collecting the Proxy, Reader and Writer together. 
      ds = new Ext.data.Store({ 
       proxy: proxy, 
       reader: reader, 
       writer: writer, // <-- plug a DataWriter into the store just as you would a Reader 
       autoSave: false // <-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton. 
      }); 

      //read the data from simple array 
      //ds.load(); 
      ds.load({ params: { start: 0, limit: 5} }); 

      var cm = new Ext.grid.ColumnModel([ 
       {header: "id", dataIndex: 'intID',hidden: true}, 
       {header: "Bussiness Unit Id",dataIndex: 'objBULookUp.strBusinessUnitDescription',sortable: true}, 
       {header: "Cal Count", width:80, dataIndex: 'intCalCount', sortable: true}, 
       {header: "Cal Type", width: 100, dataIndex: 'strCalType', sortable: true}, 
       {header: "Cal Description", width: 180, dataIndex: 'strCalDescription', sortable: true}, 
       {header: "Count Type", width: 100, dataIndex: 'strCountType', sortable: true}, 
       {header: "Cal Start", width: 100, dataIndex: 'strCalStart', sortable: true}, 
       {header: "Cal End", width: 100, dataIndex: 'strCalEnd', sortable: true}, 
       {header: "Cal ID", width: 100, dataIndex: 'strCalID', sortable: true} 
      ]); 

      sm = new Ext.grid.RowSelectionModel({singleSelect:'true'}); 
      sm.addListener('rowselect',onRowClick,this); 

      var PagingBar = new Ext.PagingToolbar({ 
       pageSize: 5, 
       store: ds, 
       displayInfo: true, 
       displayMsg: 'Displaying topics {0} - {1} of {2}', 
       emptyMsg: 'No insurers to display' 
      }); 

      dataGrid = new Ext.grid.GridPanel({applyTo:'readPanel', frame: true, 
       ds:ds, 
       cm:cm, 
       sm:sm, 
       bbar: PagingBar, 
       title:'Search Page of Business Cal',  
       width: 910, 
       height: 195 
      });   

     }; 
}(); 

しかし、私は細かい作業@ManyToOne同じコードを削除するためのコードの下に見つけてください。

私の問題を調べる努力を感謝します。

変数strBussUnitIdは、BusinessCalモデルの列で、BULookUpモデルに属します。 BULookUpモデルはstrBussUnitIdを介してマスタテーブルデータを使用してBusinessCalを格納するマスタデータテーブルです。

私たちがextjsを使用しているフロントエンドでは、strBussUnitIdを表示することができません。これは、strBussUnitIdの対応するstrBusinessUnitDescriptionに対応する数値です。そのために、Bullookupモデルを使ってBusinessCalモデルに@manytoOneを作成しました。

問題は、BusinessCalモデルで@manytoOneを追加したときに発生します。

+2

コードとスタックトレースまたは投稿されたエラーを投稿してください。 – Rohit

+2

誰かがあなたを助けることができるようになる前に、より多くの詳細を提供する必要があります。エンティティクラス(JPAアノテーション付き)と例外スタックトレースを開始してください。 – ChssPly76

答えて

0

何の例外が発生しているのか、どこから来ているのかわからなくても、遅延初期化に使用されるHibernateプロキシに関連する問題があると思います。 LazyInitializationExceptionsを取得している場合は、open session in view patternを適用する必要があります。そうしないと、Hibernateプロキシをマーシャリングしてフレームワークで整列化できないため、ブラウザに返信する際に問題が発生します。おそらく何らかの種類のアセンブリレイヤを使用して、何らかの方法でオブジェクトグラフからプロキシを削除することができます。