2011-08-04 3 views
-2

웹 응용 프로그램 Extjs, Spring3.0, JPA, Hibernate가 있습니다. 나는 잘 작동하는 단일 엔티티로 검색 페이지를 가지고 있지만 어제 사용자 엔티티에서 @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; 
    } 
} 

문제 개시 arice 난 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는 BulookUp 모델에 속하는 BusinessCal 모델의 열입니다. BULookUp 모델은 strBussUnitId를 통해 해당 마스터 테이블 데이터를 사용하여 BusinessCal을 저장하고 저장할 수있는 마스터 데이터 테이블입니다.

우리가 extjs를 사용하는 프런트 엔드에서 Noow 나는 strBussUnitId에 해당하는 strBusinessUnitDescription을 구두화할 숫자 인 strBussUnitId를 표시 할 수 없습니다. 이를 위해 Bullookup 모델로 BusinessCal 모델에서 @manytoOne을 만들었습니다.

BusinessCal 모델에 @manytoOne을 추가 할 때 문제가 발생합니다.

+2

코드와 stacktrace 또는 오류가 있으면 게시하십시오. – Rohit

+2

누군가가 당신을 도울 수 있기 전에 더 많은 세부 사항을 제공해야합니다. JPA 주석을 사용하여 엔티티 클래스를 표시하고 예외 스택 추적을 시작하십시오. – ChssPly76

답변

0

당신이 얻는 곳이나 그것이 어디서 왔는지 알지 못하는 한, 게으른 초기화에 사용되는 Hibernate 프록시와 관련된 문제가 있다고 생각합니다. 여러분이 LazyInitializationExceptions을 얻고 있다면, open session in view pattern을 적용해야합니다. 그렇지 않으면 Hibernate 프록시를 마샬링하여 프레임 워크에서 마샬 할 수 없기 때문에 브라우저로 다시 보내야하는 문제가 있습니다. 아마도 어떤 종류의 어셈블리 레이어를 사용하여 어떤 방식으로 객체 그래프에서 프록시를 제거 할 수 있습니다.