1.ActionForm里访问DAO是否有违背MVC?
  页面上有一个表单,<html:optionCollections>里绑定了一个从数据库里查出来的LIST
  而查这个LIST的代码是写在Action里的。
  不过现在有一个问题,如果表单提交的时候,没有通过ActionForm的验证,再次forward返回到这个页面的时候,这时LIST就是NULL
  那就无法再次绑定数据了!我又不想把ActionForm存在Session里,就将查这个LIST的代码写在了ActionForm的构造里,请问这样是否有违背MVC?2.hibernate映射的问题,一个列在数据库里有默认值,我在映射这个属性的时候,加了insert="false"
  不过这时发现了一个问题,当我save这个对象以后,数据库里确实添加了记录,不过有默认值的那一列,并没有将数据库生成的默认值反映到这个对象里去
  这时应该怎么办?不会是要再查一次吧?3.hibernate,在用session.get和load的时候发现的问题。
用get方法查的时候,POJO的那个空构造可以是任何访问权限
可是用load不行,我改成private它报错?请问为什么谢谢回答,只有这么多分了。

解决方案 »

  1.   

    1、的确违背了MVC,ActionForm本就存在Request对象中,无需保存,为null,说明验证过程中清空了ActionForm中的值,提交表单的整个过程,必须保证Form是同一个请求中的,否则也会丢失
    2、Hibernate产生的是完整的insert语句,所以default丢失
    3、get直接得到对象,如果库中没有返回null,load加载时如果数据库中没有抛出一个异常
      

  2.   

    TO 楼上,显示表单和处理提交的表单我是用一个action做的,是显示表单的时候,不会进行ActionForm里的检测,所以能拿到数据!
    而在提交表单的时候,会进行ActionForm的检测,如果检测不通过,则不会进Acion,而是直接forward到刚才的表单页!不过这时Action里的LIST已经被清空,所以无法再次绑定数据!这问这种情况要如何解决!是不是要用两个Action?第二三你没有回答我的问题!
    第二题我问的是如何拿到那个默认值
    第三题我是问为什么改成private就报错! 跟有没有数据没关系!数据是存在的
      

  3.   

    1,的确违背了MVC设计原则。但是不是非得用两个action,你在action里面判断下,哪个是从显示页面过来的,哪个是从处理提交页面过来,就搞定啦!
    2,你save对象的时候,应该把这个的对象的那个需要默认值的值设置好比如(bean.setAddress("shanghai")) 设死它,加insert="false"是不行的。
    3, get时,空构造是任何对象都可以访问的,这是没有错误的。你改成private,除了本类的方法外,外部是访问不到的啊,load当然会报错啦!
      

  4.   

    1.嗯 判断好了 查list部分写在Action里
    2.同意连默认值一并save进去
    3.private按常理就该报错 报的是什么错?
      

  5.   

    1.只有一个页面的啊,
       比如:product.do?action=displayForm,这时,ActionForm里检测这个action的值,发现是displayForm,所以不进行输入验证,
       ActionForm里不会进行输入验证!然后进入ACTION,ACTION查出LIST,保存到ACTIONFORM里,
       然后forward到addProduct.jsp!jsp页面里有一个表单,提交地址是:product.do?action=save
      jsp页面将这个LIST里的内容显示到一个<html:optionCollections>里  “添加”表单显示出来了,但是,如果我提交错误的数据时,先进入ActionForm,它检测到action的值是save,这时就会对输入进行验证
      验证不通过!不会进入到ACTION,而是直接转到到input(这里也是addProduct.jsp)!因为没有进入ACTION,所以ACTIONFORM里的LIST自然是NULL
      所以,这时,addProduct.jsp里的<html:optionCollections>就拿不到数据了!
      
      不知道大家看明白没有呢?
       
    2.如果连同默认值一起save,那数据库里的默认值不就没用了?
    3.将构造改成private后,再用load去取,报错如下:
    Exception in thread "main" org.hibernate.HibernateException: CGLIB Enhancement failed: entity.buMen
    at org.hibernate.proxy.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:102)
    at org.hibernate.proxy.CGLIBProxyFactory.getProxy(CGLIBProxyFactory.java:47)
    at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
    at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774)
    at dao.indexDao.main(indexDao.java:21)
    Caused by: java.lang.InstantiationException: entity.buMen$$EnhancerByCGLIB$$1568032d
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.hibernate.proxy.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:99)
    ... 10 more不过改成get就没有问题了
      

  6.   

    hibernate保留默认值需要设置下边的两个属性
    dynamic-insert="true"和 dynamic-update= "true"
      

  7.   

    验证不通过的时候能不能也让它跳转一个action 进行读取list的处理?
      

  8.   

    这个,我就是为了减少Action的数量才把多个操作写在一个Action里,用action参数的值来判断应该进行什么操作的,
    因为Action一多我容易乱(虽然说多个操作写在一个Action里也很乱)
    我感觉建一个Action就为了读一个List有点浪费吧。。
      

  9.   

    看看DispatchAction能不能完成你的业务需求 具体再探讨