ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Oscar Picasso <oscgoo...@yahoo.com>
Subject Support for Java 1.5 generics
Date Tue, 05 Apr 2005 15:12:54 GMT
Hi,

It seems that IBatis (or maybe cglib) doesn't fully support Java 1.5 generics.

Here is my use case (a somewhat deep hierarchy):

===== DOMAIN MODEL =====
//-----------------------------
public interface Persistable
{
  public void setId(Integer id);
  public Integer getId();
}

//-----------------------------
public abstract class AbstractPersistable 
  implements Persistable
{
  private Integer id;

  public Integer getId()
  {
    return id;
  }

  public void setId(Integer id)
  {
    this.id = id;
  }
}

//-----------------------------
public interface Node<N extends Node> extends Persistable
{
  public void setParent(N parent);
  public N getParent();
  ...
}

//-----------------------------
public abstract class AbstractNode<N extends AbstractNode> 
  extends AbstractPersistable implements Node<N>
{
  private N parent;

  public N getParent()
  {
    return this.parent;
  }

  public void setParent(N parent)
  {
    this.parent = parent;
  }
  ...
}

//-----------------------------
public class Category extends AbstractNode<Category>
{
  ... some other methods
}


===== DAOS CLASSES AND INTERFACES =====
//-----------------------------
public interface PersistableDAO<P extends Persistable> {
    public P findById(Integer id);
}

//-----------------------------
public interface NodeDAO<N extends Node> extends PersistableDAO<N>
{
  ... some other methods
}

//-----------------------------
public abstract class AbstractIbatisAccess<D extends Persistable> 
    extends SqlMapDaoTemplate implements PersistableDAO<D>
{

  public AbstractIbatisAccess(DaoManager manager)
  {
    super(manager);
  }

  public D findById(Integer id)
  {
    try
    {
      return (D) getSqlMapExecutor().queryForObject(getNamespace() +
".findById", id);
    } catch (SQLException e)
    {
      throw new DaoException(e);
    }
  }
  ...
}

//-----------------------------
public abstract class AbstractNodeIbatisAccess<D extends Node<D>> 
   extends AbstractIbatisAccess<D> implements NodeDAO<D>
{

  public AbstractNodeIbatisAccess(DaoManager manager)
  {
    super(manager);
  }
  ... override some methods
}

//-----------------------------
public class CategoryIbatisAccess 
  extends AbstractNodeIbatisAccess<Category> implements CategoryDAO {
    public CategoryIbatisAccess(DaoManager manager) {
        super(manager);
    }

    @Override
    protected String getNamespace() {
        return "categories";
    }
}

===== DAOS CONFIG =====
...
<dao interface="org.xenata.ads.dao.CategoryDAO"
implementation="org.xenata.ads.access.ibatis.CategoryIbatisAccess"/>
...

===== SQLMAP =====
<resultMap id="category" class="org.xenata.ads.domain.Category">
  <result property="id" column="id"/>
  <result property="parent" column="parent_id" select="categories.findById"/>
  ...
</resultMap>

<select id="findById" 
        parameterClass="int" 
        resultMap="category">
  select id,
	 parent_id,
	 ...
  from categories
  where id = #value#

</select>



=============================================	
When doing: 

CategoryDAO dao = daoManager.getDao(CategoryDAO.class);
Category category = dao.findById(1);

I get the Exception below. Any idea? Has anyone worked with generics and
iBatis? 

I am under the impression that cglib doesn't know it has to enhance an actual
Category. Or is it something that could be solved in iBatis?

Thanks.

Oscar


===== EXCEPTION TRACE =====
Testcase: testFindById(org.xenata.ads.access.ibatis.CategoryIbatisAccessTest):
Caused an ERROR
null
com.ibatis.dao.client.DaoException
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in resources/ibatis/category.xml.  
--- The error occurred while applying a result map.  
--- Check the categories.category.  
--- The error happened while setting a property on the result object.  
--- Cause: com.ibatis.common.exception.NestedRuntimeException: Error setting
properties of 'org.xenata.ads.domain.Category@9'.  Cause:
java.lang.ClassCastException:
org.xenata.ads.domain.Node$$EnhancerByCGLIB$$1e4f4b2f_2
Caused by: java.lang.ClassCastException:
org.xenata.ads.domain.Node$$EnhancerByCGLIB$$1e4f4b2f_2
Caused by: com.ibatis.common.exception.NestedRuntimeException: Error setting
properties of 'org.xenata.ads.domain.Category@9'.  Cause:
java.lang.ClassCastException:
org.xenata.ads.domain.Node$$EnhancerByCGLIB$$1e4f4b2f_2
Caused by: java.lang.ClassCastException:
org.xenata.ads.domain.Node$$EnhancerByCGLIB$$1e4f4b2f_2
	at
org.xenata.ads.access.ibatis.AbstractIbatisAccess.findById(AbstractIbatisAccess.java:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at com.ibatis.dao.engine.impl.DaoProxy.invoke(DaoProxy.java:72)
	at $Proxy3.findById(Unknown Source)
	at
org.xenata.ads.access.ibatis.CategoryIbatisAccessTest.testFindById(CategoryIbatisAccessTest.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:   


		
__________________________________ 
Do you Yahoo!? 
Yahoo! Sports - Sign up for Fantasy Baseball. 
http://baseball.fantasysports.yahoo.com/

Mime
View raw message