[EasyDBO] 双向关联导致堆栈溢出异常

[EasyDBO] 双向关联导致堆栈溢出异常

EasyDBO的实体配置,如果实体存在双向关联,并且lazy都设定为false的时候,就会产生堆栈溢出异常。

为什么会导致堆栈溢出呢?

比如存在A实体和B实体。

A实体与B实体存在一对一的双向关联,按上面所说的实体关联配置,A实体就会自动关联B(从数据库里根据已设定的外键查询B对象,把查询结果保存在关联中,即类型为B的字段),同样,当A将B对象保存为自己的关联时,B对象也自动去寻找自己的关联,上面说了,A与B是双向关联,并且lazy=false,所以B也根据自己的外键来查询A,将查询结果A对象保存为自己的关联,然后A又查询自己的关联...一直循环下去,最终,发生了堆栈溢出。

是否需要在查询一次关联后将关联的lazy重设为true呢?我试了一下,在实体在第一次寻找完自己的关联后将关联的属性设为true,就可以避免了堆栈溢出。

在EasyDBO上做的代码修改是:

在EasyJDB的private void dbo2obj(DBObject dbo, Object obj)方法中,

 

     private   void  dbo2obj(DBObject dbo, Object obj)
    
{
        
if(dbo != null)
        
{
            Map map 
= dbo.getValue();
            DBTable table 
= findTable(obj.getClass());
            
if(table == null)
            
{
                table 
= dbo.getTable();
            }

            
// this.setAutoCommit(false);
            BeanWrapper wrapper = new BeanWrapper(obj);
            java.util.Iterator it 
= table.getAllFields().entrySet().iterator();
            
while(it.hasNext())
            
{
                Map.Entry en 
= (Map.Entry)it.next();
                DBField field 
= (DBField)en.getValue();
                String popertyName 
= (String)en.getKey();

                
try
                
{
                    
if(ClassField.class.isAssignableFrom(field.getClass()))
                    
{
                        
if(logger.isDebugEnabled())
                            logger.debug(field.getClass());

                        field.setLazy(
true);//加载一次后,将lazy设定为true。否则会出现堆栈溢出错误!//这里添加了一句
                        if(field.getClass() == OneToOneField.class && !field.isLazy())
                        
{
                            
// 过滤掉OneToOne中的null属性
                            wrapper.setPropertyValue(popertyName, ((ClassField)field).loadValue(dbo, this));
                        }

    

 

感觉上,根据文档说明,lazy设定为true,但是没有起到什么作用哦。很奇怪。

我在上面的

field.setLazy(true);这里添加了一句

前面又添加了一句:

if(field.isLazy()){
       continue;
      }
感觉上不是很合理,不管了,先用着,查正原因再做修正。



你可能感兴趣的:([EasyDBO] 双向关联导致堆栈溢出异常)