【问题标题】:Why can't I save this ODocument with embeddedset property to OrientDB?为什么我不能将此带有 Embeddedset 属性的 ODocument 保存到 OrientDB?
【发布时间】:2014-03-26 05:59:58
【问题描述】:

从 Scala 访问 OrientDB 1.7-RC1,当尝试使用自定义类型对象的 embeddedset 保存 ODocument 时,我收到一个异常,指出相应字段的类型不兼容。我需要帮助找出我做错了什么。

创建/保存 ODocument 的代码如下所示,它表示一个包,其中包含一组嵌入的 Dependency 对象:

val myHashSet = new util.HashSet[models.Dependency]()
myHashSet.add(new models.Dependency("mydep", "1.0"))
val myVersion = new ODocument("Version")
  .field("id", "myversion")
  .field("dependencies", myHashSet)
myVersion.save()

这导致抛出以下异常:

com.orientechnologies.orient.core.exception.OValidationException: The field 'Version.dependencies' has been declared as EMBEDDEDSET but an incompatible type is used. Value: Dependency(mydep,1.0)
    at com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.validateEmbedded(ORecordSchemaAwareAbstract.java:429) ~[orientdb-core-1.7-rc1.jar:1.7-rc1]
    at com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.validateField(ORecordSchemaAwareAbstract.java:249) ~[orientdb-core-1.7-rc1.jar:1.7-rc1]
    at com.orientechnologies.orient.core.record.ORecordSchemaAwareAbstract.validate(ORecordSchemaAwareAbstract.java:71) ~[orientdb-core-1.7-rc1.jar:1.7-rc1]
    at com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:1357) ~[orientdb-core-1.7-rc1.jar:1.7-rc1]
    at com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:1347) ~[orientdb-core-1.7-rc1.jar:1.7-rc1]
    at com.orientechnologies.orient.core.record.impl.ODocument.save(ODocument.java:1336) ~[orientdb-core-1.7-rc1.jar:1.7-rc1]

我已经在数据库的架构中声明了 Version.dependencies 嵌入集,如下所示:

create property Version.dependencies embeddedset Dependency

Dependency 类定义如下所示(它实现了 OSerializableStream,因为这对于序列化嵌入式对象来说是必需的):

case class Dependency(var id: String, var specifier: String) extends OSerializableStream {
  def this() = this(null, null)

  override def toStream: Array[Byte] = {
    val bytes: Array[Byte] = Json.prettyPrint(Json.toJson(this)).getBytes
    bytes
  }

  override def fromStream(iStream: Array[Byte]): OSerializableStream = {
    val json = Json.parse(iStream)
    val dependency = Json.fromJson[Dependency](json).get
    dependency
  }
}

object Dependency {
  implicit val versionFormat = Json.format[Dependency]
}

我在这里做错了什么?

【问题讨论】:

    标签: scala orientdb


    【解决方案1】:

    嵌入对象必须是 ODocument 类型,它对 Dependency 实现 OSerializable 没有帮助。下面的代码展示了如何:

    val myHashSet = new java.util.HashSet[ODocument]()
    myHashSet.add(new ODocument("Dependency").field("id", "mydep").field("specifier", "1.0"))
    val myVersion = new ODocument("Version")
      .field("id", "myversion")
      .field("dependencies", myHashSet)
    myVersion.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2023-04-03
      • 2015-01-05
      • 2012-11-07
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多