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
   }
}

Для этих таблиц связанные Dao и 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, т.е. если A не содержит общедоступного B b, он работает нормально. Есть ли что-то, чего мне здесь не хватает?

Заранее большое спасибо.


person Koran    schedule 17.04.2012    source источник
comment
Можете ли вы опубликовать все исключение. Должна ли быть информация о причине для этого исключения? Кроме того, какую версию ORMLite вы используете?   -  person Gray    schedule 17.04.2012
comment
Да, речь идет не о правильном, а о вкладе и лучшем ответе. Если нет хорошего ответа, то вы должны ответить на него сами.   -  person Gray    schedule 17.04.2012
comment
Я принял лучшие ответы :) Спасибо, Грей.   -  person Koran    schedule 17.04.2012


Ответы (1)


Я подозреваю, что в конце трассировки стека исключений есть сообщение о причине, которое вам не хватает. Например, если я продублирую ваш пример выше, я получу:

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. Поля идентификации необходимы для внешних полей.

Я уверен, что A и B являются упрощенными версиями ваших классов, поэтому, если вы опубликуете больше исключений, включая всю информацию о причине, я соответствующим образом отредактирую свой ответ.

person Gray    schedule 17.04.2012
comment
Спасибо Грей. Это действительно было проблемой. Я даже видел эту проблему во время поиска этого ответа, но, поскольку у меня были все DaoImpl и т. Д., Я отвлекся. Еще раз спасибо. Вы здорово помогли. - person Koran; 17.04.2012