Extjs + Spring + JPA + HIbernate - PullRequest
       0

Extjs + Spring + JPA + HIbernate

0 голосов
/ 04 августа 2011

У нас есть веб-приложение Extjs, Spring3.0, JPA, Hibernate. У меня есть страница поиска с одной сущностью, которая работает нормально, но вчера я добавил @manytoone в User Entity, и приложение перестало работать. Extjs начинает выдавать исключение. когда я пытался отладить, я обнаружил проблему из-за отношений @manytoOne. Кто-нибудь может дать мне подсказку?

@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;
    }
}

Проблема начала возникать, когда я добавил BULookUp objBULookUp в модель BusinessCal. Позвольте мне добавить код для 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 - это просто таблица основных данных для хранения, и BusinessCal использует эти данные основной таблицы через strBussUnitId.

Теперь во внешнем интерфейсе, где мы используем extjs, я не могу показать strBussUnitId, то есть номер, который мне нужен для загрузки соответствующего strBusinessUnitDescription для strBussUnitId. Для этого я создал @manytoOne в модели BusinessCal с моделью BULookUp.

Проблема начала возникать, когда я добавил @manytoOne в модель BusinessCal.

1 Ответ

0 голосов
/ 04 августа 2011

Не зная, какое исключение вы получаете или откуда оно приходит, я предполагаю, что у вас есть проблемы, связанные с прокси Hibernate, используемыми для отложенной инициализации.Либо вы получаете LazyInitializationExceptions, для которых вам следует применить открытый сеанс в шаблоне представления , либо у вас возникла проблема с распределением прокси-серверов Hibernate для отправки обратно в браузер, посколькуваш фреймворк, и в этом случае вам нужно каким-то образом удалить прокси из графа объектов, возможно, используя какой-либо слой сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...