我有一个多对多的关系如下,
@ManyToMany(fetch=FetchType.EAGER, cascade = {CascadeType.PERSIST})
@JoinTable(name="KONFIG_GRUPPE_PAKETE", joinColumns=@JoinColumn(name="GRUPPE_ID"),
inverseJoinColumns=@JoinColumn(name="KONFIG_PAKET_ID")),
@ForeignKey(name="FK_KONFIG_GRUPPE_ID")在persist是出现异常, 但是无法捕捉。
原本没有写入cascade = {CascadeType.PERSIST}时候先是执行了主表的insert,然后试着insert到KONFIG_GRUPPE_PAKETE(就是m:n映射表)的时候在网页显示异常, 因为之前的insert没有成功(因为PK位置上的值重复了), 所以FK_KONFIG_GRUPPE_ID 没有被找到。
写入cascade之后, 仍旧无法抓到异常, 但是错误信息变成PK已存在。如何可以抓到异常? 然后才有机会处理, 而不是直接显示在网页上?另外我用的是struts,spring, hibernate的组合。 如果尝试先check PK的值, 我想放在ActionForm的validate()中进行处理, 但是这就意味着必须要在ActionForm中调用DAO了。这个是通常使用的方法吗? 偶对Design还没什么概念的, 希望有一些建议。
非常感谢!!

解决方案 »

  1.   

    can anyone help me plz?!
    upup~~
      

  2.   

    无法捕捉?
    不能吧,try一下怎么会抓不到?我也没看明白你写的那么
    但肯定没有抓不住的异常的
    另外validate()中不建议掉dao,不过你要确实有需要也是可以的
    但那样用mvc三层就没啥意思了
    你可以直接就在dao对异常作出处理
    然后就不会影响显示层也就是页面了
      

  3.   

    我就是在dao中处理异常的, 但是可能spring并没有马上真正写入datenbank, 所以在dao中没有立刻抛出异常, 之后就无法捕捉了,因为没有办法控制在哪里写入。
    具体也不是很清楚, 问题就是处在级联的情况下。大概是因为要执行两组sql的关系。最后在调用dao的insert和update之前先做了检测,避免这个异常的可能性。
      

  4.   

    在DAO中出现的异常只要你在在ActionForm中捕获都可以捕获的。
    你说的捕获应该是捕获不到低层的异常具体信息吧。
    在dao层和逻辑层出现的异常我们一般都用DataException 和BizException
    此类的自定义异常来封装低层异常,如果不打印TrakeStack的话,在ActionForm中出现
    异常后,就很难发现具体是什么异常了,一般也就是在软件开发阶段打印e.ptintTrakeStack()
    到了软件发布时,应该把e.ptintTrakeStack()去掉。
    自己都 不知道说些什么,喝了点小酒,头晕,睡觉去