【问题标题】:Datanucleus exception adding new column to hbase table向 hbase 表添加新列的 Datanucleus 异常
【发布时间】:2011-09-02 09:37:31
【问题描述】:

我正在使用DataNucleusHBase。我有一张桌子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;

如您所见,我尝试过使用insertValuedefaultValueallowsNullnullValue。但似乎没有任何效果。

堆栈跟踪如下所示:

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

我实际上添加了两个新列(mailIntervalInMillisecondsnextMailTimestamp),它们都是 long,在堆栈跟踪中我看到它试图将 db 列转换为 Long(AFAIK)

【问题讨论】:

  • 也许如果你真的声明异常 + 堆栈跟踪,那么人们会更清楚
  • @DataNucleus 我的道歉......我已经更新了我的帖子
  • 和异常本身?即类型。因为 Bytes.toLong javadoc 没有提到抛出异常(因此不完整,第三方无法猜测它抛出了什么)
  • @DataNucleus 它的 java.lang.NullPointerException

标签: jdo hbase datanucleus


【解决方案1】:

DataNucleus HBase 插件的已发布版本目前不支持所有模式演变模式。特别是当它们是原始类型时添加字段/属性。但是 DataNucleus SVN 确实支持这个,所以你可以使用它。

【讨论】:

  • 感谢您的回复。我需要在 SVN repo 下构建所有组件还是只需要“核心”模块就足够了?我目前正在使用 datanucleus-api-jdo-3.0.0-m6.jar、datanucleus-core-3.0.0-m6.jar、datanucleus-enhancer-3.0.0-m6.jar、datanucleus-hbase-3.0.0- m5.jar,datanucleus-jdo-query-3.0.0-m3.jar
  • 不需要。一切都是每晚构建的,但您需要获取最新的datanucleus.org/downloads/maven2-nightly
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2012-07-10
  • 2016-10-09
相关资源
最近更新 更多