【发布时间】:2019-02-05 23:28:17
【问题描述】:
如上图所示,我一直在尝试使用 neo4j-ogm 和 kotlin,但没有成功。如果我尝试保留我的数据,Neo4j 会抛出异常,“Class xxxx is not a valid Entity”。
package com.asofttz.micros.administrator.users.testmodels
import org.neo4j.ogm.annotation.GeneratedValue
import org.neo4j.ogm.annotation.Id
import org.neo4j.ogm.annotation.NodeEntity
import org.neo4j.ogm.annotation.Relationship
@NodeEntity
class Actor(var name: String = "") {
@Id
@GeneratedValue
open var id: Long? = null
@Relationship(type = "ACTS_IN", direction = "OUTGOING")
open val movies = hashSetOf<Movie>()
fun actsIn(movie: Movie) {
movies.add(movie)
movie.actors.plus(this)
}
}
@NodeEntity
class Movie(var title: String = "", var released: Int = 2000) {
@Id
@GeneratedValue
open var id: Long? = null
@Relationship(type = "ACTS_IN", direction = "INCOMING")
open var actors = setOf<Actor>()
}
有办法吗?有没有其他方法可以使用 kotlin 将数据持久化到 Neo4j 数据库?
N:B。我正在使用 kotlin 版本 1.2.60 和 Neo4j-OGM v3.2.1
更新
下面是我的其余代码import com.asofttz.micros.administrator.users.testmodels.Actor
import com.asofttz.micros.administrator.users.testmodels.Movie
import org.neo4j.ogm.config.Configuration
import org.neo4j.ogm.session.SessionFactory
import java.util.*
object Neo4j {
val configuration = Configuration.Builder()
.uri("bolt://localhost")
.credentials("neo4j", "password")
.build()
val sessionFactory = SessionFactory(configuration, "test.movies.domain")
fun save() {
val session = sessionFactory.openSession()
val movie = Movie("The Matrix", 1999)
session.save(movie)
val matrix = session.load(Movie::class.java, movie.id)
for (actor in matrix.actors) {
println("Actor: " + actor.name)
}
}
}
build.gradle 文件如下所示
apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: "org.jetbrains.kotlin.plugin.noarg"
repositories {
jcenter()
mavenCentral()
maven { url "http://dl.bintray.com/kotlin/ktor" }
maven { url "https://dl.bintray.com/kotlin/kontlinx" }
}
noArg {
annotation("org.neo4j.ogm.annotation.NodeEntity")
annotation("org.neo4j.ogm.annotation.RelationshipEntity")
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "io.ktor:ktor:$ktor_version"
compile "io.ktor:ktor-server-netty:$ktor_version"
compile project(":asoftlibs:micros:administrator:users:users-jvm")
compile 'org.neo4j:neo4j-ogm-core:3.1.2'
compile 'org.neo4j:neo4j-ogm-bolt-driver:3.1.2'
}
kotlin {
experimental {
coroutines "enable"
}
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
sourceCompatibility = "1.8"
我得到了类 'com.asofttz.micros.administrator.users.testmodels.Movie 不是有效实体' 进一步的帮助将不胜感激。
注意:我还尝试在没有婴儿车构造器的情况下打开电影类,但 id ddnt 也有帮助。另一种尝试是更改neo4j-ogm的版本,所以我测试了2.1.5、3.0.1和3.1.2。没有成功
【问题讨论】:
-
您也可以发布您的实体吗?
-
我再次编辑了这个问题。包含的实体
-
如果您将您的班级声明为
open class Actor(var name: String = ""),它应该可以工作。或者,您可以使用全开放 gradle 插件(或 kotlin-spring 插件,它是全开放的包装器) -
@JasperBlues 添加了它。 ddnt 工作。它说'Class class com.asofttz.micros.administrator.users.testmodels.Movie 不是有效的实体类。请检查实体映射。附言。我添加了 allOpen 插件
-
您能否尝试将
var name: String = ""类型设为可选。电影类也是如此。失败请压缩并发送电子邮件至 jasper@graphaware.com