2012-04-17 95 views
4

我有以下的表格 -Ormlite - 構造函數調用失敗時BaseDaoImpl擴展

@DatabaseTable(tableName="b", daoClass=B_DaoImpl.class) 
public class B { 

    @DatabaseField 
    public String b1 ; 

    public B(){ 
    // For Ormlite 
    } 
} 

@DatabaseTable(tableName="a", daoClass=A_DaoImpl.class) 
public class A { 

    @DatabaseField 
    public String a1 ; 

    @DatabaseField(foreign=true) 
    public B b; 

    public A(){ 
    // For Ormlite 
    } 
} 

對於這些表,相關道和DaoImpl如下

public interface A_Dao extends Dao<A, String>{} 
public interface B_Dao extends Dao<B, String>{} 


public class B_DaoImpl extends BaseDaoImpl<User, String> implements B_Dao { 

    public B_DaoImpl(ConnectionSource connectionSource) throws SQLException { 
     super(connectionSource, B.class); 
    } 
} 

public class A_DaoImpl extends BaseDaoImpl<User, String> implements A_Dao { 

    public A_DaoImpl(ConnectionSource connectionSource) throws SQLException { 
     super(connectionSource, A.class); 
    } 
} 

數據庫幫手如下:

public class DatabaseHelperImpl extends OrmLiteSqliteOpenHelper implements DatabaseHelper { 

    private A_DaoImpl aDao = null; 
    private B_DaoImpl bDao = null; 

    public B_DaoImpl getBDao() throws SQLException { 
     if (bDao == null) { 
      bDao = getDao(B.class); 
     } 
     return bDao; 
    } 

    public A_DaoImpl getA() throws SQLException { 
     if (aDao == null) { 
      aDao = getDao(A.class); 
     } 
     return aDao; 
    } 
} 

現在,當我嘗試調用 -

ADao aDao = databaseHelper.getA(); 

它出現了錯誤,錯誤如下:

Could not call the constructor in class class A_DaoImpl 

現在,如果我沒有在A中的foriegn關鍵 - 即,如果不包含公衆B B,它工作正常。有什麼我在這裏失蹤?

非常感謝您提前。

+0

你可以發佈整個異常。應該有該異常的原因信息?另外,你使用的ORMLite版本是什麼? – Gray 2012-04-17 02:09:38

+0

是的,這不是關於「正確」,而是關於貢獻和最佳答案。如果沒有好的答案,那麼你應該自己回答。 – Gray 2012-04-17 03:20:03

+0

我接受了最好的答案:)謝謝灰色。 – Koran 2012-04-17 03:30:39

回答

5

我懷疑你的異常堆棧跟蹤結束時缺少原因消息。例如,如果我複製你上面的例子,我得到:

java.sql.SQLException: Could not call the constructor in class class 
     com.j256.ormlite.table.CustomDaoTest$A_DaoImpl 
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) 
    ... 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    ... 
Caused by: java.lang.IllegalArgumentException: Foreign field class 
>>>>  com.j256.ormlite.table.CustomDaoTest$B does not have id field <<<<<< 
    at com.j256.ormlite.field.FieldType.configDaoInformation(FieldType.java:332) 
    ... 

因爲A具有B類的洋場,然後B需要有一個ID字段。外來字段需要標識字段。

我敢肯定AB是你類的簡化版本,所以如果你發佈了更多的例外,包括所有的原因信息,我會適當地編輯我的答案。

+1

謝謝灰色。這確實是問題。我在研究這個答案時甚至看到了這個問題 - 但是因爲我擁有所有DaoImpl等,所以我受到了一些限制。再次感謝你。你有很大的幫助。 – Koran 2012-04-17 03:19:26