用自定义getter在EL表达式中检测HibernateEntityBean中的ObjectNotFound数据丢失错误
用自定义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,让您的程序更健壮。
用自定义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,让您的程序更健壮。