【问题标题】:Extjs + Spring + JPA + HIbernateExtjs + Spring + JPA + HIbernate
【发布时间】:2011-10-19 15:03:51
【问题描述】:

我们有 Web 应用程序 Extjs、Spring3.0、JPA、Hibernate。我有单个实体的搜索页面,它工作正常,但昨天我在用户实体中添加了@manytoone,应用程序停止工作。 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;
    }
}

当我在 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 模型只是要存储的主数据表,BusinessCal 通过 strBussUnitId 使用该主表数据。

现在在我们使用 extjs 的前端,我无法显示 strBussUnitId,这是我需要为 strBussUnitId 提供对应的 strBusinessUnitDescription 的数字。为此,我使用 BULookUp 模型在 BusinessCal 模型中创建了 @manytoOne。

当我在 BusinessCal 模型中添加 @manytoOne 时出现问题。

【问题讨论】:

  • 发布您的代码和堆栈跟踪或您收到的任何错误。
  • 您需要提供更多详细信息,然后才能有人帮助您。向我们展示您的实体类(带有 JPA 注释)和异常堆栈跟踪以开始。

标签: hibernate spring jpa extjs


【解决方案1】:

在不知道你得到什么异常或它来自哪里的情况下,我猜你遇到了与用于延迟初始化的 Hibernate 代理相关的问题。要么你得到 LazyInitializationExceptions,你应该为此应用open session in view pattern,或者你在编组 Hibernate 代理以发送回浏览器时遇到问题,因为它们不能被你的框架编组,在这种情况下你'需要以某种方式从对象图中删除代理,可能使用某种组装层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2011-01-04
    • 2015-09-13
    • 2016-06-26
    • 2015-11-24
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多