【问题标题】:Cannot persist to Cassandra with datanucleus on UUID无法使用 UUID 上的数据核持久保存到 Cassandra
【发布时间】:2015-11-16 15:22:35
【问题描述】:

我有一个表,其中定义了一个 ID 字段:

create table XXX (
id uuid primary key,
name varchar,
....

而我的班级 XXX 是这么注释的:

public class XXX {

@PrimaryKey
@Persistent(customValueStrategy = "uuid")
public UUID id;
...

当尝试发出 PersistenceManager.makePersistent() 时,我得到:

线程“主”javax.jdo.JDOFatalInternalException 中的异常:为字段 XXX.id 生成的 Id 无效,id:54e5abde-732b-42ff-af92-06af89af46ff 在 org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:673) 在 org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:720) 在 org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:740) 在 Importer.save(StayImporter.java:84) 在 Importer.exec(StayImporter.java:102) 在 Importer.main(Importer.java:110) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) NestedThrowablesStackTrace: 为字段 XXX.id 生成的 Id 无效,id:54e5abde-732b-42ff-af92-06af89af46ff org.datanucleus.exceptions.NucleusException:为字段 XXX.id 生成的 Id 无效,id:54e5abde-732b-42ff-af92-06af89af46ff 在 org.datanucleus.store.AbstractStoreManager.getStrategyValue(AbstractStoreManager.java:1300) 在 org.datanucleus.state.StateManagerImpl.populateStrategyFields(StateManagerImpl.java:2201) 在 org.datanucleus.state.StateManagerImpl.initialiseForPersistentNew(StateManagerImpl.java:418) 在 org.datanucleus.state.StateManagerImpl.initialiseForPersistentNew(StateManagerImpl.java:120) 在 org.datanucleus.state.ObjectProviderFactoryImpl.newForPersistentNew(ObjectProviderFactoryImpl.java:218) 在 org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2078) 在 org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1922) 在 org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1777) 在 org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:715) 在 org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:740)

UUID 在我看来不错,为什么不起作用?

Maven 是:

<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-accessplatform-jdo-cassandra</artifactId>
<version>4.2.1</version>
<type>pom</type>
</dependency>

<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>2.1.9</version>
</dependency>

Cassandra 版本是 2.2.3

【问题讨论】:

  • 我原以为所有的生成器通常都是基于字符串或整数的。如果将该字段设为字符串会发生什么?这也不是真正的例外......将被嵌套
  • 我已经包含了嵌套异常
  • 使用字符串字段,我得到:org.datanucleus.exceptions.NucleusException: Invalid Id generated for XXX.id, id : 7aa194c8-06d2-491f-9ccb-4e52db36dd0a
  • 使用带有“uuid”生成的字符串字段没有问题
  • 你能显示一些代码吗?

标签: java cassandra uuid datanucleus


【解决方案1】:

查看此论坛帖子:http://www.datanucleus.org/servlet/forum/viewthread_thread,7922_lastpage,yes#lastpost

摘自链接内容:

"UUIDGenerator" 生成字符串。因此,您当前不能使用它来生成带有已发布代码的 UUID 值。 Nightly 构建添加了对将 String 生成的值转换为 TimeZone、Locale、UUID、Currency 的支持,因此应该使用它。

除非您可以轻松获取代码并创建自己的 ValueGenerator 插件,该插件扩展 AbstractGenerator 以生成 UUID 对象。

【讨论】:

  • 我认为他们昨天发布的 DataNucleus 4.1.7 / 4.2.2 有这个变化,所以应该开箱即用。建议您检查
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2013-08-19
  • 2014-08-31
  • 1970-01-01
  • 2013-09-02
  • 2019-10-05
相关资源
最近更新 更多