`
lokki
  • 浏览: 59073 次
  • 来自: ...
社区版块
存档分类
最新评论

用自定义getter在EL表达式中检测HibernateEntityBean中的ObjectNotFound数据丢失异常

阅读更多
用自定义getter在EL表达式中检测HibernateEntityBean中的ObjectNotFound数据丢失异常

在Hibernate中,Restaurant对象建立many-to-one关联到Street对象,当Street数据被删除时,可以用双向关联设置级联将Restaurant.street设置为null。
如果不是双向关联,则不能设置为null,删除Street时如无做动作,Restaurant表的streetDataId字段不为null,但Street表已没对应数据。
而Restaurant.getStreet()不为null,Restaurant.getStreet().getDataId()仍可操作(只是用Restaurant表的streetDataId字段,不会进行数据库操作),
但Restaurant.getStreet().getStreetName()会出现ObjectNotFound异常,

在.java中可捕捉任何异常进行处理,但当PO不经过转换成VO就传递至jsp时,jsp的EL表达式${restaurant.street.streetName}只能处理null异常,
不能处理ObjectNotFound异常,以致用户见到一堆乱码无法进行任何挽救的操作。如果没特殊处理,EL表达式不能作这样的检测。

有些人会在Restaurant.street的getter里写检测代码或者作更多的处理,比如会new一个非null的Street返回:
public Street getStreet()
{
    try
    {
        if(street==null)
            street=new Street();
        else
            street.getStreetName();//检测Street数据是否能访问。
    }
    catch(Exception ex)
    {
        street=new Street();
    }
    return street;
}
但这种做法是错误的,因为会改变数据库字段getter/setter的通常用法,不可预料和控制。

这时,不妨可以写个另外不和数据库字段关联的不同名字的getter,既不会让代码混乱,又可在需要检测时方便使用:
public boolean getStreetAvailable()
{
    boolean available=true;
    try
    {
        street.getArea().getCity();//检测关联的数据是否能访问。
    }
    catch(Exception ex)
    {
        available=false;
    }
    return available;
}

灵活利用getter,让您的程序更健壮。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics