Исключение Datanucleus при добавлении нового столбца в таблицу hbase - PullRequest
1 голос
/ 02 сентября 2011

Я использую DataNucleus с HBase . У меня был стол user. Он содержал 4 ряда. Теперь я добавил новый столбец в таблицу. Теперь каждый раз, когда я обращаюсь к любому старому объекту user, у которого нет этого столбца, DataNucleus выдает исключение, когда он пытается сопоставить столбец со свойством в POJO. Нет ли другого способа, кроме обновления старых «пользовательских» объектов фиктивными данными? Мое сопоставление объектов выглядит примерно так:

@Persistent(columns={@Column(name="next_mail_timestamp", insertValue="#NULL", defaultValue = "#NULL", allowsNull = "true")}, name="nextMailTimestamp", cacheable="false", nullValue=NullValue.DEFAULT)
    private long nextMailTimestamp;

Как видите, я пытался использовать insertValue, defaultValue, allowsNull, nullValue. Но, похоже, ничего не работает.

Трассировка стека выглядит следующим образом:

at org.apache.hadoop.hbase.util.Bytes.toLong(Bytes.java:479)
    at org.apache.hadoop.hbase.util.Bytes.toLong(Bytes.java:453)
    at org.datanucleus.store.hbase.fieldmanager.FetchFieldManager.fetchLongField(FetchFieldManager.java:269)
    at org.datanucleus.state.AbstractStateManager.replacingLongField(AbstractStateManager.java:2133)
    at com.kuliza.sitepulse.data.User.jdoReplaceField(User.java)
    at com.kuliza.sitepulse.data.User.jdoReplaceFields(User.java)
    at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:1989)
    at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2009)
    at org.datanucleus.store.hbase.query.HBaseQueryUtils$2.fetchFields(HBaseQueryUtils.java:226)
    at org.datanucleus.state.JDOStateManagerImpl.loadFieldValues(JDOStateManagerImpl.java:803)
    at org.datanucleus.state.JDOStateManagerImpl.initialiseForHollow(JDOStateManagerImpl.java:210)
    at org.datanucleus.state.ObjectProviderFactory.newForHollowPopulated(ObjectProviderFactory.java:88)
    at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2794)
    at org.datanucleus.store.hbase.query.HBaseQueryUtils.getObjectUsingApplicationIdForResult(HBaseQueryUtils.java:221)
    at org.datanucleus.store.hbase.query.HBaseQueryUtils.getObjectsOfType(HBaseQueryUtils.java:168)
    at org.datanucleus.store.hbase.query.HBaseQueryUtils.getObjectsOfCandidateType(HBaseQueryUtils.java:80)
    at org.datanucleus.store.hbase.query.JDOQLQuery.performExecute(JDOQLQuery.java:271)
    at org.datanucleus.store.query.Query.executeQuery(Query.java:1766)
    at org.datanucleus.store.query.Query.executeWithArray(Query.java:1655)
    at org.datanucleus.store.query.Query.execute(Query.java:1628)
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:221)
    at com.kuliza.sitepulse.service.DataService.getUserWithCredentials(DataService.java:111)
    at com.kuliza.sitepulse.service.AuthenticationService.getUserWithCredentials(AuthenticationService.java:46)
    at com.kuliza.sitepulse.controller.AuthenticationController.signIn(AuthenticationController.java:69)

и мой метод (в DataService.java:111) (который выдает исключение)

@Override
    public User getUserWithCredentials(String userName, String password){
        PersistenceManager pm = pmf.getPersistenceManager();
        Query q = pm.newQuery("SELECT FROM " + User.class.getName() + " WHERE userName == \""+userName+"\"" +" && password == " +
                " \""+password + "\"");
        List<User> c = (List<User>)q.execute();
        pm.close();
        if(c.size() > 0)
            return c.get(0);
        else
            return null;
    }

Я фактически добавил два новых столбца (mailIntervalInMilliseconds, nextMailTimestamp), которые оба long, и в трассировке стека я вижу, что он пытается преобразовать столбец БД в Long (AFAIK)

1 Ответ

0 голосов
/ 02 сентября 2011

Выпущенные версии плагина DataNucleus HBase в настоящее время не поддерживают все режимы эволюции схемы. В частности, добавление полей / свойств, когда они имеют примитивные типы. Однако DataNucleus SVN поддерживает это, так что вы можете использовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...