grails / gorm-neo4j Goto Github PK
View Code? Open in Web Editor NEWGORM for Neo4j
License: Apache License 2.0
GORM for Neo4j
License: Apache License 2.0
The monolithic grails project has been broken up into several smaller projects. Visit http://github.com/grails.
Having this structure:
class Player extends AbstractGraphDomain {
String name
Application application
static mapping = {
dynamicAssociations true
}
String getParentAppName() {
if (application?.parent) {
return application.parent.name
}
return null
}
}
class Application extends AbstractGraphDomain {
String name
String appVersion
Application parent
static constraints = {
appVersion nullable: true
type nullable: true, bindable: true
parent nullable: true
}
}
When trying to check if a player's application has parent (which is another application) and this parent is null,
Player player = Player.findByName("player1")
String app = player.getParentAppName()
it's throwing this exception:
java.lang.reflect.InvocationTargetException: null
at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.dao.DataIntegrityViolationException: Proxy for [core.Application] for association [core.Application] could not be initialized
at org.grails.datastore.mapping.proxy.AssociationQueryProxyHandler.resolveDelegate(AssociationQueryProxyHandler.java:83)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.resolveDelegateAndGetProperty(GroovyObjectMethodHandler.java:59)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.getProperty(GroovyObjectMethodHandler.java:52)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.handleInvocation(GroovyObjectMethodHandler.java:167)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.handleInvocation(EntityProxyMethodHandler.java:76)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.invoke(GroovyObjectMethodHandler.java:141)
at core.Player.getParentAppName(Player.groovy:20)
at core.PlayerController.$tt__updatePlayer3(PlayerController.groovy:49)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93)
... 14 common frames omitted
You can reproduce this by downloading: https://github.com/mburak/sampleapp and checking out branch 'dup-assoc'
I am getting the next error:
org.grails.datastore.mapping.model.DatastoreConfigurationException: Unable to start embedded Neo4j server: org/eclipse/jetty/server/SessionManager
at org.grails.datastore.gorm.neo4j.connections.Neo4jConnectionSourceFactory.create(Neo4jConnectionSourceFactory.java:81)
at org.grails.datastore.gorm.neo4j.connections.Neo4jConnectionSourceFactory.create(Neo4jConnectionSourceFactory.java:30)
at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64)
at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52)
at org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24)
at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:250)
at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:272)
at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:282)
at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:320)
at neo4j.movies.MovieServiceSpec.$spock_initializeSharedFields(MovieServiceSpec.groovy:12)
Caused by: java.lang.NoClassDefFoundError: org/eclipse/jetty/server/SessionManager
at org.neo4j.server.CommunityNeoServer.createWebServer(CommunityNeoServer.java:89)
at org.neo4j.server.AbstractNeoServer.init(AbstractNeoServer.java:181)
at org.neo4j.server.AbstractNeoServer.start(AbstractNeoServer.java:196)
at org.neo4j.harness.internal.InProcessServerControls.start(InProcessServerControls.java:72)
at org.neo4j.harness.internal.AbstractInProcessServerBuilder.newServer(AbstractInProcessServerBuilder.java:137)
at org.grails.datastore.gorm.neo4j.util.EmbeddedNeo4jServer.start(EmbeddedNeo4jServer.java:175)
at org.grails.datastore.gorm.neo4j.util.EmbeddedNeo4jServer.start(EmbeddedNeo4jServer.java:88)
at org.grails.datastore.gorm.neo4j.util.EmbeddedNeo4jServer.attemptStartServer(EmbeddedNeo4jServer.java:185)
at org.grails.datastore.gorm.neo4j.util.EmbeddedNeo4jServer.start(EmbeddedNeo4jServer.java:53)
at org.grails.datastore.gorm.neo4j.connections.Neo4jConnectionSourceFactory.create(Neo4jConnectionSourceFactory.java:75)
... 9 more
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.SessionManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 19 more
while running the next Unit test in a Grails 3.3.0 app:
package neo4j.movies
import grails.gorm.transactions.Rollback
import org.grails.datastore.gorm.neo4j.Neo4jDatastore
import spock.lang.AutoCleanup
import spock.lang.Shared
import spock.lang.Specification
@SuppressWarnings(['MethodName', 'DuplicateNumberLiteral', 'UnnecessaryGetter', 'TrailingWhitespace'])
class MovieServiceSpec extends Specification {
@Shared @AutoCleanup Neo4jDatastore datastore = new Neo4jDatastore(getClass().getPackage())
MovieService service = datastore.getService(MovieService)
@Rollback
void 'Test search movies'() {
given:
new Movie(title: 'The Matrix', tagline: 'Free your mind', released: 1999).save(flush:true)
expect: 'to find results'
service.search('Matr')
service.search('The')
!service.search('The Wrestler')
}
}
I have the next rest runtime dependency
testRuntime "org.neo4j.test:neo4j-harness:3.1.2"
Other persons have reported similar failures while running integration tests with Spring Boot 1.5 and Neo4j
The complete
folder in the next repository contains a Grails 3 application with an @Ignored
test which demonstrates this issue.
I'm getting the following exception:
org.neo4j.driver.v1.exceptions.ClientException: Unable to convert org.sampleapp.core.Club to Neo4j Value.
at org.neo4j.driver.v1.Values.value(Values.java:96)
at org.neo4j.driver.v1.Values.value(Values.java:182)
at org.neo4j.driver.v1.Values.value(Values.java:82)
at org.neo4j.driver.v1.Values.value(Values.java:232)
at org.neo4j.driver.v1.Values.value(Values.java:83)
at org.neo4j.driver.v1.Values.value(Values.java:232)
at org.neo4j.driver.internal.ExplicitTransaction.run(ExplicitTransaction.java:170)
at org.grails.datastore.gorm.neo4j.Neo4jSession.processInsertsForEntity(Neo4jSession.java:567)
at org.grails.datastore.gorm.neo4j.Neo4jSession.flushPendingInserts(Neo4jSession.java:406)
at org.grails.datastore.mapping.core.AbstractSession.flush(AbstractSession.java:337)
at org.grails.datastore.gorm.neo4j.Neo4jSession.flush(Neo4jSession.java:826)
at org.grails.datastore.mapping.query.Query.flushBeforeQuery(Query.java:699)
at org.grails.datastore.mapping.query.Query.doList(Query.java:582)
at org.grails.datastore.mapping.query.Query.singleResult(Query.java:577)
at org.grails.datastore.gorm.finders.AbstractFindByFinder.invokeQuery(AbstractFindByFinder.java:35)
at org.grails.datastore.gorm.finders.AbstractFindByFinder$1.doInSession(AbstractFindByFinder.java:29)
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:319)
at org.grails.datastore.gorm.finders.AbstractFinder.execute(AbstractFinder.java:42)
at org.grails.datastore.gorm.finders.AbstractFindByFinder.doInvokeInternal(AbstractFindByFinder.java:27)
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:252)
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:390)
at org.grails.datastore.gorm.finders.FinderMethod$invoke$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:141)
at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:172)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.staticMethodMissing(GormEntity.groovy:749)
at org.grails.datastore.gorm.GormEntity$Trait$Helper$staticMethodMissing$3.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:141)
at org.sampleapp.core.Player.staticMethodMissing(Player.groovy)
at org.sampleapp.core.Player$staticMethodMissing.callStatic(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:214)
at org.sampleapp.core.Player.$static_methodMissing(Player.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1504)
at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1492)
at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:53)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at org.sampleapp.core.InitializeService.$tt__initialize(InitializeService.groovy:34)
at org.sampleapp.core.InitializeService$_initialize_closure1.doCall(InitializeService.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at groovy.lang.Closure.call(Closure.java:414)
at org.sampleapp.core.InitializeService$_initialize_closure1.call(InitializeService.groovy)
at groovy.lang.Closure.call(Closure.java:430)
at org.sampleapp.core.InitializeService$_initialize_closure1.call(InitializeService.groovy)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93)
at org.sampleapp.core.InitializeService.initialize(InitializeService.groovy)
at org.sampleapp.core.InitializeService$initialize.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at sampleapp.BootStrap.initialize(BootStrap.groovy:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:158)
at sampleapp.BootStrap$_closure1.doCall(BootStrap.groovy:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1092)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:408)
at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:535)
at grails.util.Environment.executeForEnvironment(Environment.java:528)
at grails.util.Environment.executeForCurrentEnvironment(Environment.java:504)
at org.grails.web.servlet.boostrap.DefaultGrailsBootstrapClass.callInit(DefaultGrailsBootstrapClass.java:62)
at org.grails.web.servlet.context.GrailsConfigUtils.executeGrailsBootstraps(GrailsConfigUtils.java:65)
at org.grails.plugins.web.servlet.context.BootStrapClassRunner.onStartup(BootStrapClassRunner.groovy:53)
at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy:256)
at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:337)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:388)
at grails.boot.GrailsApp.run(GrailsApp.groovy:375)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at sampleapp.Application.main(Application.groovy:8)
This is the code:
Club club = new Club(name: "club1")
club.save()
Player player = new Player(name: "player1", __appName__: "app1")
player.application = application
player.club = club
player.save()
where club is a dynamic property.
You can see this behavior by downloading https://github.com/mburak/sampleapp and starting app the application on an empty database.
I created a very basic application using grails 3.3.0 and neo4j plugin 6.1.4
I have the following domains:
class Person {
static mapWith = "neo4j"
String name
Activity principalActivity
static hasMany = [phones: Phone]
static constraints = {
name nullable: false, blank: false
principalActivity nullable: true
}
static mapping = {
dynamicAssociations true
phones cascade: "all-delete-orphan"
}
}
class Phone {
static mapWith = "neo4j"
String number
static belongsTo = [person:Person]
static constraints = {
number nullable: false, blank: false
}
}
class Activity {
static mapWith = "neo4j"
String description
static constraints = {
description nullable: false
}
}
In BootStrap.groovy I'm creating initial data
class BootStrap {
def init = { servletContext ->
Phone phone3 = new Phone(number: '4451-1227')
Phone phone4 = new Phone(number: '4452-1227')
Phone phone5 = new Phone(number: '4453-1227')
Person p1 = new Person(name: 'Person 1', principalActivity: new Activity(description: 'Jobless'))
p1.addToPhones(number: '3333-2122')
p1.save(failOnError: true)
Person p2 = new Person(name: 'Person 2')
p2.addToPhones(phone3)
p2.addToPhones(phone4)
Person p3 = new Person(name: 'Person 3')
Person p4 = new Person(name: 'Person 4')
//Creates a dynamic association one to one
p4.mainPhone = phone5
p2.save()
p3.save()
p4.save()
}
In neo4j I got all Persons, Phones and the activity persisted correctly but without any relationship between them.
neo4j> MATCH (n:
Person) RETURN n;
(:Person {name: "Person 1", version: 0})
(:Person {name: "Person 2", version: 0})
(:Person {name: "Person 3", version: 0})
(:Person {name: "Person 4", version: 0})
neo4j> MATCH (n:
Activity) RETURN n;
(:Activity {description: "Jobless", version: 0})
neo4j> MATCH (n:
Phone) RETURN n;
(:Phone {number: "3333-2122", version: 0})
(:Phone {number: "4451-1227", version: 0})
(:Phone {number: "4452-1227", version: 0})
(:Phone {number: "4453-1227", version: 0})
If you try to get all relationships of Person I will not get any
neo4j> MATCH (n:
Person)-[r]-() RETURN r;
neo4j>
You can reproduce this running the application in https://github.com/mvinas1977/sampleApp
The query
https://gyazo.com/2ca3f7c263107a864728188138391476
Its builded to:
QUERY Cypher [MATCH (n:AclEntry), (n)-[:ACLOBJECTIDENTITY]->(m_1), (n)-[:SID]->(m_0) WHERE ( ( m_0.sid=~{1} ) AND ( m_1.objectId={2} ) AND ) OPTIONAL MATCH(n)-[:SID]->(sidNode) OPTIONAL MATCH(n)-[:ACLOBJECTIDENTITY]->(aclObjectIdentityNode) RETURN n as data , collect(DISTINCT aclObjectIdentityNode) as aclObjectIdentityNodes, collect(DISTINCT sidNode) as sidNodes ] for params [[1:^\QadminUser5\E$, 2:rootClass5]]
and this too:
https://gyazo.com/18e3ab1341fa785e9b19e6b1c02f0a11
QUERY Cypher [MATCH (n:AclEntry), (n)-[:ACLOBJECTIDENTITY]->(m_0), (n)-[:SID]->(m_1), (m_1)-[:SID]->(m_2) WHERE ( ( AND ( m_2.__id__={1} ) ) ) OPTIONAL MATCH(n)-[:SID]->(sidNode) OPTIONAL MATCH(n)-[:ACLOBJECTIDENTITY]->(aclObjectIdentityNode) RETURN n as data , collect(DISTINCT aclObjectIdentityNode) as aclObjectIdentityNodes, collect(DISTINCT sidNode) as sidNodes ] for params [[1:%admin%]]
We have a simple case where we have
class Club {
String name
Country country
}
When we do the following in a club with an existing country:
club.country = null
club.save()
it's not removing the relationship as expected.
You can see an example of that in https://github.com/mburak/neo4j-app. There's an action in ClubController to remove the country from a club.
If i countBy a relationship, i get this error:
class Membership implements Relationship<User, Team> {
static mapWith = "neo4j"
}
def total=Membership.countByTo(Team.get(id))
error:
Type mismatch: r already defined with conflicting type Relationship (expected Node) (line 1, column 33 (offset: 32))
"MATCH (n:User)-[r]->(to:Team), (r)-[:TO]->(m_0) WHERE ( ID(m_0)={1} ) RETURN count(*) "
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ^. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
Upgraded to 6.1 and it's throwing an IdentityGenerationException wit this message: "
CREATE operation did not generate an identifier for entity ..."
I have the id generator configured globally in application.groovy this way:
grails.neo4j.default.mapping = {
id generator: 'snowflake'
}
I think the issues has to do with this code in GraphPersistentEntity. It's trying to get that IdGenerator from mappingContext, but it's never set on that object. In previous versions this was set as SnowflakeIdGenerator by default, but that was removed in the last version.
case IdGenerator.Type.SNOWFLAKE:
return ((Neo4jMappingContext)mappingContext).getIdGenerator()
Let's say we have the following classes:
Club { String name hasMany = [players: Player] }
Player { String name belongsTo = [club: Club] }
BoardMember { String name Club club }
when deleting a Club, it's deleting all the related BoardMember object's to that Club.
It seems that as the Player belongsTo relationship has the same name as the BoardMember , it's deleting both.
If we change a class label to use a static one, let say we have Club, but we set the static label to be __Club__
, then if we use that class in a dynamic association, GORM is using the class name to create the sourceType property for that relationship but then it tries to load the relationship using the label so it fails.
Trying to load an object this way:
Player player = Player.find("MATCH (n:Player) WHERE n.name = {name} RETURN n", params)
or this way
Player player = Player.executeCypher("MATCH (n:Player) WHERE n.name = {name} RETURN n", params) as Player
when trying to access a related object's id it's returning a wrong one. In this case player.application.id is the same as player.id. This doesn't happen when you load the object with GORM finders or get.
You can reproduce this by downloading the project at https://github.com/mburak/sampleapp, branch 'wrong-proxy'.
1 - Start up the application on an empty db.
2 - Call rest api 'http://localhost:8080/player/checkIds
Having this classes:
class Player {
String name
Application application
static mapping = {
dynamicAssociations true
}
}
class Application {
String name
String appVersion
static constraints = {
appVersion nullable: true
}
}
I create a player1 with an Application app1. Then in a controller actuib I update the player's application to be app2 but in the database I see both relationships:
neo4j-sh (?)$ ls -a 48
:Player
*dateCreated =[1492546127413]
*lastUpdated =[1492546127413]
*name =[player1]
*version =[0]
(player1,48)-[:club]->(club2,47)
(player1,48)-[:APPLICATION]->(app2,45)
(player1,48)-[:APPLICATION]->(app1,44)
You can reproduce this by downloading the project at https://github.com/mburak/sampleapp, branch 'dup-assoc'.
1 - Start up the app
2 - Access rest controller action club/updatePlayer
Even when the changed properties (being dynamic or not) are updated correctly, the lastUpdated property is not updated.
You can check this behavior in this project https://github.com/mburak/neo4j-app and running an ajax call to http://localhost:8080/neo4j-app/clubs/{id}/changeAddress/{newAddress}
After upgrading to 6.1, we are getting a NullPointeException in this line in Neo4jDatastore:
if(graphPersistentEntity.getIdGenerator() != null && graphPersistentEntity.getIdGeneratorType().equals(IdGenerator.Type.SNOWFLAKE)) {
The problem is that when the idGenerator is custom, the idGeneratorType is not set so graphPersistentEntity.getIdGeneratorType is null.
Update to use Neo4j Driver v1.0.4 and Neo4j v3.0.3.
I have a very simple model
`class Club extends BaseGraphDomain {
String name
static constraints = {
name nullable: false, blank: false, unique: true
}
}`
`class Player extends BaseGraphDomain {
String name
Integer number
static belongsTo = [club: Club]
static constraints = {
name nullable: false, blank: false, unique: true
number nullable: false, validator: { it > 0 }
}
}`
each Players belongs to a club
the problem is when you try to use a related object
`Player player = Player.get(someId)
print player.club`
the related object, in this case club, has all its properties with right values, except id that is same one than the player one
you can reproduce it using this sampleApplication
https://github.com/mvinas1977/neo4jSampleApp
if you do
http://localhost:8080/players/show/4
it show a player, you can see that player-club's id is 4 same than player's id
{"id":4,"dateCreated":"2017-11-28T19:17:35Z","lastUpdated":"2017-11-28T19:17:35Z","name":"Blass Armando Giunta","number":8,"club":{"id":4}}
If you list clubs you will see that there is only one and its id is 0
[{"id":0,"dateCreated":"2017-11-28T19:17:35Z","lastUpdated":"2017-11-28T19:17:35Z","name":"Boca Jrs"}]
The following test fails in 6.0.x branch.
def "test clear and set again dynamic collection association"() {
setup:
def cosima = new Pet(name: 'Cosima')
def lara = new Pet(name: 'Lara')
def fred = new Pet(name: 'Fred')
cosima.buddies = [lara, fred]
when:
cosima.save()
session.flush()
session.clear()
def pet = Pet.findByName("Cosima")
pet.buddies.clear()
pet.save(flush:true)
session.clear()
pet = Pet.findByName("Cosima")
lara = Pet.findByName('Lara')
pet.buddies = [lara]
pet.save(flush:true)
session.clear()
pet = Pet.findByName("Cosima")
def result = session.transaction.nativeTransaction.execute("MATCH (n:Pet {__id__:{1}})-[:buddies]->(l) return l", [cosima.id])
then:"The relationship is empty"
IteratorUtil.count(result) == 1
pet.buddies instanceof Collection
pet.buddies.size() == 1
pet.buddies.first().name == 'Lara'
}
As Neo4j plugin really is committing the transactions on close (and not on commit), this event is not working correctly because is triggered before the Neo4j transactions are committed leading to an unpredicted behavior.
Current SNAPSHOT is stable for a while and can be released if no further work has been planned.
Having an association like this:
class Player extends AbstractGraphDomain {
String name
List<Club> formerClubs = []
static hasMany = [formerClubs: Club]
static mapping = {
formerClubs lazy: false, fetch: "eager"
}
}
when we try to add a new object to the association we get this:
java.lang.reflect.InvocationTargetException: null
at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.UnsupportedOperationException: null
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at org.grails.datastore.mapping.dirty.checking.DirtyCheckingCollection.add(DirtyCheckingCollection.groovy:52)
at org.grails.datastore.gorm.neo4j.collection.Neo4jList.add(Neo4jList.groovy:59)
at org.sampleapp.core.PlayerController.$tt__updatePlayer4(PlayerController.groovy:68)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93)
... 14 common frames omitted
You can reproduce this by downloading the project at https://github.com/mburak/sampleapp and checking out branch called 'assoc-error'.
#1. Start the project on an empty db
#2. Do an ajax call to http://localhost:8080/player/updatePlayer4
We have one object that has an attribute property and we have a constraint for it, no matter what the constraint is (just nullable:true would do it). We we start up the application we get this exception:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.datastore.gorm.neo4j.Neo4jDatastore]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: object is not an instance of declaring class at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:267) ... 60 more Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1210) at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1123) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1127) at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1123) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166) at com.brinqa.platform.core.model.DataModel$__clinit__closure16.doCall(DataModel.groovy:66) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1210) at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1123) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019) at groovy.lang.Closure.call(Closure.java:426) at com.brinqa.platform.core.model.DataModel$__clinit__closure16.call(DataModel.groovy) at groovy.lang.Closure.call(Closure.java:442) at com.brinqa.platform.core.model.DataModel$__clinit__closure16.call(DataModel.groovy) at org.grails.datastore.mapping.config.groovy.DefaultMappingConfigurationBuilder.evaluate(DefaultMappingConfigurationBuilder.groovy:88) at org.grails.datastore.mapping.config.groovy.DefaultMappingConfigurationBuilder.evaluate(DefaultMappingConfigurationBuilder.groovy) at org.grails.datastore.mapping.config.AbstractGormMappingFactory.evaluateWithContext(AbstractGormMappingFactory.java:99) at org.grails.datastore.mapping.config.AbstractGormMappingFactory.createMappedForm(AbstractGormMappingFactory.java:84) at org.grails.datastore.gorm.neo4j.GraphPersistentEntity.<init>(GraphPersistentEntity.groovy:47) at org.grails.datastore.gorm.neo4j.Neo4jMappingContext.createPersistentEntity(Neo4jMappingContext.java:116) at org.grails.datastore.gorm.neo4j.Neo4jMappingContext.createPersistentEntity(Neo4jMappingContext.java:111) at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntities(AbstractMappingContext.java:199) at org.grails.datastore.gorm.neo4j.Neo4jMappingContext.<init>(Neo4jMappingContext.java:92) at org.grails.datastore.gorm.neo4j.Neo4jDatastore.createMappingContext(Neo4jDatastore.java:282) at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:216) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1075)
Here you can download a sample project where you can reproduce it just by starting it: https://github.com/mburak/neo4j-app
Updated to latest GORM release and getting this:
> Could not find org.grails.plugins:neo4j:6.1.4.RELEASE.
Required by:
project :platform
Can you release neo4j 6.1.4 to be in sync with grails-data-mapping release?
Thanks.
We have some listeners that listen to persistent events and try to create different objects on those events. It looks that these objects are not created at all using GORM standard functions.
This seems to be a pretty basic use case, is there anything wrong in what we are doing?
You can see a sample project in https://github.com/mburak/neo4j-app. There we have a listener "OtherListener" that listens to PostInsert and tries to create a simple object. If you start the project on a empty database you will see that it should be creating some of these objects but looking at the database, they are not there.
Setting a dynamic property to null for an association that is one-to-one is not removing the relationship in the database.
You can reproduce this by running this sample app: https://github.com/mburak/neo4j-app and doing this Ajax call: http://localhost:8080/neo4j-app/clubs/{id}/removeCaptain (remplace {id} with some id in the database). The club's captain won't be deleted.
Let's say we have a Club class and a Player class and we create a dynamic relationship between them called players. We add a new player to that collection and GORM creates the right relationship. But after that you set that collection to empty [], then GORM creates a new empty simple property with the same name as the relationship and leaves that relationship untouched.
If you tried to set the dynamic property again, it wouldn't work anymore.
Presently, only global grails.neo4j.* settings are honored for configuration. For proper use of neo4j (bolt driver edition), we would need per environment settings, such as environments.development.neo4j.*, test, and production variants.
Please see [https://github.com/jmlittle/envNeo] for sample project. The project implies that you have a neo4j 3.x service running at the default port, and in the sample project, the username/password of neo4j is used.
The error one receives when using an environmental settings block is the same as when one doesn't assign any neo4j settings within application.yml
ERROR org.springframework.boot.SpringApplication - Application startup failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'neo4jTransactionManager' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'neo4jDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.datastore.gorm.neo4j.Neo4jDatastore]: Constructor threw exception; nested exception is org.neo4j.driver.v1.exceptions.ClientException: Authentication token must contain: 'scheme : basic' (ID:8D751B007CC145D2FD07055706D6D6C86EAE412C09B0009A31783E820FA92CB7)
If we have two relationShips with same from and to, finder queries are not correct because relationship's type is not present in the translated cypher query.
For example, consider this example from the documentation:
class CastMember implements Relationship<Person, Movie> {
List<String> roles = []
}
CastMember cm = CastMember.findByRoles(['Neo'])
This query translates to:
MATCH (n:Celeb)-[r]->(to:Movie) WHERE ( r.roles={1} ) RETURN r as rel, n as from, to as to
] for params [[1:[Neo]]
it should translates to:
MATCH (n:Celeb)-[r:CASTMEMBER]->(to:Movie) WHERE ( r.roles={1} ) RETURN r as rel, n as from, to as to
] for params [[1:[Neo]]
There should be a way to say that a collection is a collection of persistent entities even when it's null because otherwise it creates a wrong property and then it uses that property instead of the relationship.
Trying to execute something like this on a Neo4j entity:
Person.find("MATCH (n:`Person`) WHERE (n.`dueDate` = {value}) RETURN n", [value: new Date()])
is throwing this error:
org.neo4j.driver.v1.exceptions.ClientException: Unable to convert java.util.Date to Neo4j Value.
at org.neo4j.driver.v1.Values.value(Values.java:96)
at org.neo4j.driver.v1.Values.value(Values.java:232)
at org.neo4j.driver.internal.InternalTransaction.run(InternalTransaction.java:146)
at grails.neo4j.Neo4jEntity$Trait$Helper.find(Neo4jEntity.groovy:267)
at grails.neo4j.Neo4jEntity$Trait$Helper.find(Neo4jEntity.groovy:263)x
Hi there,
In multi tenant relationship, tenantId is not persisted.
class Membership implements MultiTenant<Membership>, Relationship<User, Team> {
static mapWith = "neo4j"
Long tenantId
}
So i get error with finder queries because tenantId does not exist.
Trying to
run grails test-app :integration
seems that it's not getting the right DataSource config.
I have this configured on the environments section:
test {
grails {
neo4j {
type = "embedded"
location = "${myEnv}/data"
embedded {
options = [
'dbms.active_database': "graph_test.db",
]
}
}
}
but it's trying to use "remote" type and therefore not finding the right db and throwing the following exception:
Caused by: org.neo4j.driver.v1.exceptions.ClientException: Unable to connect to 'localhost' on port 7687, ensure the database is running and that there is a working network connection to it. at org.neo4j.driver.internal.connector.socket.SocketClient.start(SocketClient.java:79) at org.neo4j.driver.internal.connector.socket.SocketConnection.<init>(SocketConnection.java:63) at org.neo4j.driver.internal.connector.socket.SocketConnector.connect(SocketConnector.java:52) at org.neo4j.driver.internal.pool.InternalConnectionPool$1.allocate(InternalConnectionPool.java:191) at org.neo4j.driver.internal.pool.InternalConnectionPool$1.allocate(InternalConnectionPool.java:180) at org.neo4j.driver.internal.pool.ThreadCachingPool.allocate(ThreadCachingPool.java:212) at org.neo4j.driver.internal.pool.ThreadCachingPool.acquireFromGlobal(ThreadCachingPool.java:164) at org.neo4j.driver.internal.pool.ThreadCachingPool.acquire(ThreadCachingPool.java:118) at org.neo4j.driver.internal.pool.InternalConnectionPool.acquire(InternalConnectionPool.java:109) at org.neo4j.driver.internal.InternalDriver.session(InternalDriver.java:53) at org.grails.datastore.gorm.neo4j.Neo4jDatastore.setupIndexing(Neo4jDatastore.java:385) at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:107) at org.grails.datastore.gorm.neo4j.Neo4jDatastore.<init>(Neo4jDatastore.java:217) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
Let's say we have:
class Person {
static hasMany = [phones: Phone]
}
class Phone {
String phoneNumber
static belongsTo = Person
}
if we do this:
person1.removeFromPhones(phone1)
person1.update()
Shouldn't that delete the whole Phone object from the db in addition to the relationship? We don't see it's doing that.
We also tried to add some mapping like this:
static mapping = {
phones cascade: "all-delete-orphan"
}
with no luck.
Getting the following exception in many unit tests. It was working fine on 6.0.9. Is there anything that we need to change in tests?
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'org.grails.datastore.gorm.GormStaticApi@7d3de280' with class 'org.grails.datastore.gorm.GormStaticApi' to class 'org.grails.datastore.gorm.neo4j.api.Neo4jGormStaticApi'
at grails.neo4j.Neo4jEntity$Trait$Helper.find(Neo4jEntity.groovy:243)
at com.brinqa.platform.core.model.Attribute.getDataModel(Attribute.groovy:190)
at com.brinqa.platform.core.model.Attribute._clinit__closure6$_closure7(Attribute.groovy:83)
at groovy.lang.Closure.call(Closure.java:414)
at org.grails.validation.ValidatorConstraint.processValidate(ValidatorConstraint.java:87)
at grails.validation.AbstractConstraint.validate(AbstractConstraint.java:107)
at grails.validation.ConstrainedProperty.validate(ConstrainedProperty.java:979)
at org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:206)
at org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81)
at org.grails.datastore.gorm.GormValidationApi.doValidate(GormValidationApi.groovy:116)
at org.grails.datastore.gorm.GormValidationApi.validate(GormValidationApi.groovy:197)
at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:97)
at com.brinqa.platform.core.model.DataModel$__clinit__closure23.closure25$_closure26(DataModel.groovy:98)
at com.brinqa.platform.core.model.DataModel._clinit__closure23$_closure25(DataModel.groovy:97)
at groovy.lang.Closure.call(Closure.java:414)
at org.grails.validation.ValidatorConstraint.processValidate(ValidatorConstraint.java:87)
at grails.validation.AbstractConstraint.validate(AbstractConstraint.java:107)
at grails.validation.ConstrainedProperty.validate(ConstrainedProperty.java:979)
at org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:206)
at org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81)
at org.grails.datastore.gorm.GormValidationApi.doValidate(GormValidationApi.groovy:116)
at org.grails.datastore.gorm.GormValidationApi.validate(GormValidationApi.groovy:197)
at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:97)
at com.brinqa.platform.analytics.AnalyticsControllerSpec.createDataModels(AnalyticsControllerSpec.groovy:299)
at com.brinqa.platform.analytics.AnalyticsControllerSpec.test execute (age transformation)(AnalyticsControllerSpec.groovy:90)
Neo4j driver team has added few additional config options such as,
withEncryption()
withoutEncryption()
withLeakedSessionsLogging()
withConnectionLivenessCheckTimeout( long value, TimeUnit unit )
Currently only single arg with
methods are supported. It would be good to extend support for no args or more than one args.
When we are updating an existing object that has some relationships, we see that RelationshipPendingInsert is deleting and creating the same relationship. Doing this is throwing some tasks in Neo4j and can lead to certain lock conditions (maybe related with this issue neo4j/neo4j#6914).
Is there a way to avoid this and check if the relationship needs to be recreated ?
We are seeing same behavior both on v6.0.0 and 5.0.10.
This is a sample app where you can see it: https://github.com/mburak/neo4j-app
2016-07-01 17:59:38,035 [localhost-startStop-1] DEBUG RelationshipPendingInsert:109 DELETE Cypher [MATCH (from:Club {id: {start}})-[r:rival{sourceType:'Club',targetType:'Club'}]->() DELETE r] for parameters [{start=4162776920394866693, end=[4162776920394866689]}]
2016-07-01 17:59:38,036 [localhost-startStop-1] DEBUG RelationshipPendingInsert:134 MERGE Cypher [MATCH (from:Club), (to:Club) WHERE from.id = {start} AND to.id IN {end} MERGE (from)-[r:rival{sourceType:'Club',targetType:'Club'}]->(to)] for parameters [{start=4162776920394866693, end=[4162776920394866689]}]
When running the integration tests we are getting this:
org.springframework.transaction.UnexpectedRollbackException: Rollback exception, originated at (org.grails.datastore.gorm.neo4j.Neo4jDatastoreTransactionManager@5517e36b) null; nested exception is java.lang.NullPointerException
at org.codehaus.groovy.grails.transaction.ChainedTransactionManager.rollback(ChainedTransactionManager.java:208)
at org.codehaus.groovy.grails.test.support.GrailsTestTransactionInterceptor.destroy_closure2(GrailsTestTransactionInterceptor.groovy:85)
at groovy.lang.Closure.call(Closure.java:426)
at org.codehaus.groovy.grails.test.support.GrailsTestTransactionInterceptor.destroy(GrailsTestTransactionInterceptor.groovy:83)
at grails.test.spock.IntegrationSpec.destroyTransaction(IntegrationSpec.groovy:89)
at grails.test.spock.IntegrationSpec.cleanup(IntegrationSpec.groovy:70)
Caused by: java.lang.NullPointerException
at org.grails.datastore.mapping.transactions.DatastoreTransactionManager.doRollback(DatastoreTransactionManager.java:179)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:849)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:826)
at org.codehaus.groovy.grails.transaction.MultiTransactionStatus.rollback(MultiTransactionStatus.java:82)
at org.codehaus.groovy.grails.transaction.ChainedTransactionManager.rollback(ChainedTransactionManager.java:191)
... 5 more
When i delete a class that implements Relationship, it deletes only the Relationship in neo4j but not its node.
Why creating a relationship also creates a node ?
We have the following classes:
class Player extends AbstractGraphDomain {
String name
static mapping = {
dynamicAssociations true
labels "__Player__", { GraphPersistentEntity pe, Player instance ->
"Player__${instance.name}"
}
}
}
class Club extends AbstractGraphDomain {
String name
static mapping = {
dynamicAssociations true
labels "__Club__", { GraphPersistentEntity pe, Club instance ->
"Club__${instance.name}"
}
}
}
We set a dynamic property called "club" to a player object. Then when we try to access that property we are getting the following exception:
org.grails.datastore.mapping.engine.NonPersistentTypeException: [__Club__, Club__club1]
at org.grails.datastore.gorm.neo4j.engine.DynamicAssociationSupport.loadDynamicAssociations(DynamicAssociationSupport.java:91)
at grails.neo4j.Neo4jEntity$Trait$Helper$_getAt_closure1.doCall(Neo4jEntity.groovy:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:430)
at org.grails.datastore.gorm.GormStaticApi$_withSession_closure21.doCall(GormStaticApi.groovy:811)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at groovy.lang.Closure.call(Closure.java:414)
at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:54)
at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:124)
at com.sun.proxy.$Proxy102.doInSession(Unknown Source)
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:319)
at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:40)
at org.grails.datastore.gorm.GormStaticApi.withSession(GormStaticApi.groovy:810)
at grails.neo4j.Neo4jEntity$Trait$Helper.getAt(Neo4jEntity.groovy:82)
at grails.neo4j.Neo4jEntity$Trait$Helper$getAt$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at core.Player.getAt(Player.groovy)
at grails.neo4j.Neo4jEntity$Trait$Helper.propertyMissing(Neo4jEntity.groovy:54)
at grails.neo4j.Neo4jEntity$Trait$Helper$propertyMissing.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at core.Player.propertyMissing(Player.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaClassImpl.invokeMissingProperty(MetaClassImpl.java:883)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1864)
at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:1155)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3763)
at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:1167)
at core.AbstractGraphDomain.getProperty(AbstractGraphDomain.groovy)
at core.Player.getProperty(Player.groovy)
at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:50)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307)
at core.InitializeService.$tt__initialize(InitializeService.groovy:20)
at core.InitializeService$_initialize_closure1.doCall(InitializeService.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
at groovy.lang.Closure.call(Closure.java:414)
at core.InitializeService$_initialize_closure1.call(InitializeService.groovy)
at groovy.lang.Closure.call(Closure.java:430)
at core.InitializeService$_initialize_closure1.call(InitializeService.groovy)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:96)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93)
at core.InitializeService.initialize(InitializeService.groovy)
at core.InitializeService$initialize.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at sampleapp2.BootStrap.initialize(BootStrap.groovy:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
You can reproduce that by running the project in https://github.com/mburak/sampleapp
It looks that it's not creating the relationships correctly when i'm creating/updating different objects that have dynamic relationships in the same tx. At the end they relationships are in the incorrect nodes.
You can see the this sample app https://github.com/mburak/neo4j-app where we are creating a link between a Club and a Player with a dynamic association called 'captain'. If you check the db after startup, those relationships are wrong. And also you can see the logs where it's doing a lot of relationship creation for the same object to different targets which doesn't make sense. These are some of them:
2016-07-22 12:08:19,681 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,682 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658075142]}]
2016-07-22 12:08:19,682 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,683 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658116101]}]
2016-07-22 12:08:19,683 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,684 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658107909]}]
2016-07-22 12:08:19,685 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,686 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658066949]}]
2016-07-22 12:08:19,687 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,688 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658075138]}]
2016-07-22 12:08:19,690 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,690 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658132480]}]
2016-07-22 12:08:19,691 [localhost-startStop-1] DEBUG RelationshipPendingInsert:110 DELETE Cypher [MATCH (from:Player {__id__: {start}})-[r:captain{sourceType:'Player',targetType:'Player'}]->() DELETE r] for parameters [{start=4162803605658157059}]
2016-07-22 12:08:19,691 [localhost-startStop-1] DEBUG RelationshipPendingInsert:135 MERGE Cypher [MATCH (from:Player), (to:Player) WHERE from.__id__ = {start} AND to.__id__ IN {end} MERGE (from)-[r:captain{sourceType:'Player',targetType:'Player'}]->(to)] for parameters [{start=4162803605658157059, end=[4162803605658116097]}]
We are seeing a lot of queries of this kind:
2016-07-23 09:49:52,080 [http-nio-8080-exec-4] DEBUG Neo4jAssociationQueryExecutor:98 Lazy loading association [com.brinqa.platform.apps.Application->createdBy] using relationship (from:Application:CI__Application)-[:CREATEDBY]->(to:User)
even when we don't have an explicit lazy: false on the Application mapping. Shouldn't be lazy by default?
Is there any configuration we are missing?
I'm trying to save a bunch of objects (400 or so) without explicitly save, so it waits until the end of the tx and tries to persist the dirty ones on tx commit/flush.
If the object has dynamic associations GORM is trying to check if they are dirty and it tries to retrieve the related object to do that and that triggers a new flush we generates an stack overflow error.
You can reproduce this starting this project https://github.com/mburak/neo4j-app on a new db and doing an ajax call to this url: http://localhost:8080/neo4j-app/clubs/updatePlayers
I'm pasting part of the stack trace.
2017-01-17 15:38:51,410 [http-nio-8080-exec-3] DEBUG Neo4jEntityPersister:340 unmarshalling entity [app.Player] with id [3100080889764118544], props node<619>, {}
2017-01-17 15:38:51,410 [http-nio-8080-exec-3] DEBUG Neo4jEntityPersister:359 QUERY Cypher [MATCH (m:Player {__id__:{id}})-[r]-(o) RETURN type(r) as relType, startNode(r)=m as out, r.sourceType as sourceType, r.targetType as targetType, {ids: collect(o.__id__), labels: collect(labels(o))} as values] for parameters [{id=3100080889764118544}]
2017-01-17 15:38:51,412 [http-nio-8080-exec-3] DEBUG Neo4jDatastoreTransactionManager:128 Initiating transaction commit
2017-01-17 15:38:51,413 [http-nio-8080-exec-3] DEBUG Neo4jDatastoreTransactionManager:128 Flushing Session prior to transaction commit [org.grails.datastore.gorm.neo4j.Neo4jSession@58c62fb0]
2017-01-17 15:38:51,729 [http-nio-8080-exec-3] DEBUG Neo4jDatastoreTransactionManager:141 Initiating transaction rollback after commit exception
java.lang.StackOverflowError
at org.grails.datastore.mapping.dirty.checking.DirtyCheckable$Trait$Helper$hasChanged$0.call(Unknown Source)
at app.Player.hasChanged(Player.groovy)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.shouldIgnore(Neo4jEntityPersister.java:789)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistEntity(Neo4jEntityPersister.java:668)
at org.grails.datastore.mapping.engine.EntityPersister.persist(EntityPersister.java:183)
at org.grails.datastore.mapping.core.AbstractSession.persist(AbstractSession.java:583)
at org.grails.datastore.gorm.neo4j.Neo4jSession.persistDirtyButUnsavedInstances(Neo4jSession.java:715)
at org.grails.datastore.gorm.neo4j.Neo4jSession.flush(Neo4jSession.java:642)
at org.grails.datastore.mapping.query.Query.flushBeforeQuery(Query.java:681)
at org.grails.datastore.mapping.query.Query.list(Query.java:554)
at org.grails.datastore.mapping.query.Query.singleResult(Query.java:579)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.retrieveEntity(Neo4jEntityPersister.java:235)
at org.grails.datastore.mapping.engine.EntityPersister.retrieve(EntityPersister.java:219)
at org.grails.datastore.mapping.core.AbstractSession.retrieve(AbstractSession.java:639)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.initializeTarget(SessionEntityProxyMethodHandler.java:69)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.resolveDelegate(SessionEntityProxyMethodHandler.java:57)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.getProxyTarget(EntityProxyMethodHandler.java:111)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.handleInvocationFallback(SessionEntityProxyMethodHandler.java:83)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.handleInvocation(EntityProxyMethodHandler.java:78)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.invoke(GroovyObjectMethodHandler.java:141)
at app.Tag_$$_javassist_7.hasChanged(Tag_$$_javassist_7.java)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistAssociationsOfEntity(Neo4jEntityPersister.java:808)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.registerPendingUpdate(Neo4jEntityPersister.java:785)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistEntity(Neo4jEntityPersister.java:687)
at org.grails.datastore.mapping.engine.EntityPersister.persist(EntityPersister.java:183)
at org.grails.datastore.mapping.core.AbstractSession.persist(AbstractSession.java:583)
at org.grails.datastore.gorm.neo4j.Neo4jSession.persistDirtyButUnsavedInstances(Neo4jSession.java:715)
at org.grails.datastore.gorm.neo4j.Neo4jSession.flush(Neo4jSession.java:642)
at org.grails.datastore.mapping.query.Query.flushBeforeQuery(Query.java:681)
at org.grails.datastore.mapping.query.Query.list(Query.java:554)
at org.grails.datastore.mapping.query.Query.singleResult(Query.java:579)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.retrieveEntity(Neo4jEntityPersister.java:235)
at org.grails.datastore.mapping.engine.EntityPersister.retrieve(EntityPersister.java:219)
at org.grails.datastore.mapping.core.AbstractSession.retrieve(AbstractSession.java:639)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.initializeTarget(SessionEntityProxyMethodHandler.java:69)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.resolveDelegate(SessionEntityProxyMethodHandler.java:57)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.getProxyTarget(EntityProxyMethodHandler.java:111)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.handleInvocationFallback(SessionEntityProxyMethodHandler.java:83)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.handleInvocation(EntityProxyMethodHandler.java:78)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.invoke(GroovyObjectMethodHandler.java:141)
at app.Tag_$$_javassist_7.hasChanged(Tag_$$_javassist_7.java)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistAssociationsOfEntity(Neo4jEntityPersister.java:808)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.registerPendingUpdate(Neo4jEntityPersister.java:785)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistEntity(Neo4jEntityPersister.java:687)
at org.grails.datastore.mapping.engine.EntityPersister.persist(EntityPersister.java:183)
at org.grails.datastore.mapping.core.AbstractSession.persist(AbstractSession.java:583)
at org.grails.datastore.gorm.neo4j.Neo4jSession.persistDirtyButUnsavedInstances(Neo4jSession.java:715)
at org.grails.datastore.gorm.neo4j.Neo4jSession.flush(Neo4jSession.java:642)
at org.grails.datastore.mapping.query.Query.flushBeforeQuery(Query.java:681)
at org.grails.datastore.mapping.query.Query.list(Query.java:554)
at org.grails.datastore.mapping.query.Query.singleResult(Query.java:579)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.retrieveEntity(Neo4jEntityPersister.java:235)
at org.grails.datastore.mapping.engine.EntityPersister.retrieve(EntityPersister.java:219)
at org.grails.datastore.mapping.core.AbstractSession.retrieve(AbstractSession.java:639)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.initializeTarget(SessionEntityProxyMethodHandler.java:69)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.resolveDelegate(SessionEntityProxyMethodHandler.java:57)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.getProxyTarget(EntityProxyMethodHandler.java:111)
at org.grails.datastore.mapping.proxy.SessionEntityProxyMethodHandler.handleInvocationFallback(SessionEntityProxyMethodHandler.java:83)
at org.grails.datastore.mapping.proxy.EntityProxyMethodHandler.handleInvocation(EntityProxyMethodHandler.java:78)
at org.grails.datastore.mapping.proxy.GroovyObjectMethodHandler.invoke(GroovyObjectMethodHandler.java:141)
at app.Tag_$$_javassist_7.hasChanged(Tag_$$_javassist_7.java)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistAssociationsOfEntity(Neo4jEntityPersister.java:808)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.registerPendingUpdate(Neo4jEntityPersister.java:785)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.persistEntity(Neo4jEntityPersister.java:687)
at org.grails.datastore.mapping.engine.EntityPersister.persist(EntityPersister.java:183)
at org.grails.datastore.mapping.core.AbstractSession.persist(AbstractSession.java:583)
at org.grails.datastore.gorm.neo4j.Neo4jSession.persistDirtyButUnsavedInstances(Neo4jSession.java:715)
at org.grails.datastore.gorm.neo4j.Neo4jSession.flush(Neo4jSession.java:642)
at org.grails.datastore.mapping.query.Query.flushBeforeQuery(Query.java:681)
I have this model
`package sampleneo4japp
class Activity {
static mapWith = "neo4j"
String description
Person owner
Category category
static belongsTo = [owner: Person]
static constraints = {
}
static mapping = {
owner fetch:"eager"
}
}
`
When I try to render it in a json view I have the following error:
Request processing failed; nested exception is grails.views.ViewRenderException: Error rendering view: Proxy for [sampleneo4japp.Category] for association [sampleneo4japp.Category] could not be initialized
Same thing happens if you try to use activity.category in controller's action, If you map the relationship as fetch "eager" this error disappears
To reproduce it you can download the following application
https://github.com/mvinas1977/sampleNeo4jApp
and execute:
http://localhost:8080/activity/showFull?description=Activity%201
if you execute next link it will work fine because doesn't include category association, just owner that is eager
http://localhost:8080/activity/show?description=Activity%201
Doing something like this:
Person.findByFirstName(null)
is returning some Person-labeled object in the db (that doesn't have that property set to null)
It should return null.
If i findByFromAndTo i get this error:
Example:
class Membership implements Relationship<User, Team> {
static mapWith = "neo4j"
static mapping = {
type: "IS_PLAYER"
}
}
Membership membership = Membership.findByFromAndTo(User.get(id), Team.get(id))
Error:
Variable `from` not defined (line 1, column 51 (offset: 50))
"MATCH (n:User)-[r:MEMBERSHIP]->(to:Team) WHERE ( ID(from)={1} AND ID(to)={2} ) RETURN r as rel, n as from, to as to "
Cypher query is not translated correctly, and if relationship type is configured in the mapping block, it should be taken in finderQueries without Specifying it like findByFromAndToAndType().
Loading related entities got broken after this commit: 81f13bc
2016-10-24 14:36:38,255 [localhost-startStop-1] ERROR StackTrace:213 Full Stack Trace:
org.grails.datastore.mapping.engine.NonPersistentTypeException: [Player, club_FC Barcelona]
at org.grails.datastore.gorm.neo4j.Neo4jMappingContext.findPersistentEntityForLabels(Neo4jMappingContext.java:144)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.unmarshall(Neo4jEntityPersister.java:561)
at org.grails.datastore.gorm.neo4j.engine.Neo4jEntityPersister.unmarshallOrFromCache(Neo4jEntityPersister.java:281)
at org.grails.datastore.gorm.neo4j.collection.Neo4jResultList.nextDecodedInternal(Neo4jResultList.groovy:91)
at org.grails.datastore.gorm.neo4j.collection.Neo4jResultList.nextDecoded(Neo4jResultList.groovy:79)
at org.grails.datastore.gorm.query.AbstractResultList.convertObject(AbstractResultList.java:97)
at org.grails.datastore.gorm.query.AbstractResultList.get(AbstractResultList.java:82)
at org.grails.datastore.mapping.query.Query.singleResult(Query.java:580)
at org.grails.datastore.gorm.finders.AbstractFindByFinder.invokeQuery(AbstractFindByFinder.java:35)
at org.grails.datastore.gorm.finders.AbstractFindByFinder$1.doInSession(AbstractFindByFinder.java:29)
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:318)
at org.grails.datastore.gorm.finders.AbstractFinder.execute(AbstractFinder.java:42)
at org.grails.datastore.gorm.finders.AbstractFindByFinder.doInvokeInternal(AbstractFindByFinder.java:27)
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:174)
at org.grails.datastore.gorm.finders.DynamicFinder.invoke(DynamicFinder.java:374)
at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:173)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.staticMethodMissing(GormEntity.groovy:749)
at BootStrap.initUEFA(BootStrap.groovy:144)
You can see that on the project at https://github.com/mburak/neo4j-app
Having the following persistent class:
class Player extends AbstractGraphDomain {
String name
Application application
static mapping = {
dynamicAssociations true
}
When I load an object of that class from the db:
Player player = Player.findByName("player1")
and then check for any dynamic property:
if (player.clubs == null) {
player.clubs = [club1, club2]
}
if that property is null, is getting into the DynamicAssociationSupport and loading all the relationships and putting them in the object:
object.putAt(key.getType(), value);
which is weird but also this is causing the relationships properties to be dirty.
You can reproduce this behaviour by downloading: https://github.com/mburak/sampleapp and checking out branch 'dup-assoc'.
1 - Start app on an empty db.
2 - Call rest url http://localhost:8080/player/updatePlayer2
I get this error when running app in PRODUCTION Environment (i'm using grails 3.2.6).
In DEVELOPMENT Environment, it works well.
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@26b894bd: startup date [Mon Feb 13 23:39:10 CET 2017]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:404)
at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:253)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1033)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:555)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:388)
at grails.boot.GrailsApp.run(GrailsApp.groovy:375)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at testapp326.Application.main(Application.groovy:8)
2017-02-13 23:39:14.322 ERROR --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Destroy method on bean with name 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor' threw an exception
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@26b894bd: startup date [Mon Feb 13 23:39:10 CET 2017]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:404)
at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:253)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1033)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:555)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:388)
at grails.boot.GrailsApp.run(GrailsApp.groovy:375)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at testapp326.Application.main(Application.groovy:8)
2017-02-13 23:39:14.325 ERROR --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Destroy method on bean with name 'grailsApplicationPostProcessor' threw an exception
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@26b894bd: startup date [Mon Feb 13 23:39:10 CET 2017]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:404)
at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:253)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1033)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:555)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:388)
at grails.boot.GrailsApp.run(GrailsApp.groovy:375)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at testapp326.Application.main(Application.groovy:8)
2017-02-13 23:39:14.340 ERROR --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Destroy method on bean with name 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory' threw an exception
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@26b894bd: startup date [Mon Feb 13 23:39:10 CET 2017]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:404)
at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:253)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1033)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:555)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:388)
at grails.boot.GrailsApp.run(GrailsApp.groovy:375)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at testapp326.Application.main(Application.groovy:8)
2017-02-13 23:39:14.359 ERROR --- [ main] o.s.boot.SpringApplication : Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedServletContainerCustomizerBeanPostProcessor': BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Unsatisfied dependency expressed through method 'setConfigurers' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hibernateDatastore': Unsatisfied dependency expressed through method 'setMessageSource' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:479)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:235)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:702)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:527)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:388)
at grails.boot.GrailsApp.run(GrailsApp.groovy:375)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at testapp326.Application.main(Application.groovy:8)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Unsatisfied dependency expressed through method 'setConfigurers' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hibernateDatastore': Unsatisfied dependency expressed through method 'setMessageSource' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:667)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:372)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:101)
at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:88)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:103)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:248)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1037)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1011)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:473)
... 19 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hibernateDatastore': Unsatisfied dependency expressed through method 'setMessageSource' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:648)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:145)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:923)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:804)
at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:558)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:432)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:395)
at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:220)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1260)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1180)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1096)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:659)
... 45 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hibernateDatastore': Unsatisfied dependency expressed through method 'setMessageSource' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:667)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
... 61 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:659)
... 71 common frames omitted
Caused by: java.lang.NullPointerException: null
at org.grails.spring.context.support.PluginAwareResourceBundleMessageSource.afterPropertiesSet(PluginAwareResourceBundleMessageSource.java:115)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 81 common frames omitted
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':bootRun'.
> Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
| Error Failed to start server (Use --stacktrace to see the full trace)
Here is my build.gradle:
buildscript {
repositories {
mavenLocal()
maven { url "https://repo.grails.org/grails/core" }
}
dependencies {
classpath "org.grails:grails-gradle-plugin:$grailsVersion"
classpath "org.grails.plugins:hibernate5:6.0.7"
classpath "org.grails.plugins:views-gradle:1.1.5"
}
}
version "0.1"
group "testapp326"
apply plugin:"eclipse"
apply plugin:"idea"
apply plugin:"war"
apply plugin:"org.grails.grails-web"
apply plugin:"org.grails.plugins.views-json"
repositories {
mavenLocal()
maven { url "https://repo.grails.org/grails/core" }
}
dependencyManagement {
imports {
mavenBom "org.grails:grails-bom:$grailsVersion"
}
applyMavenExclusions false
}
def gormVersion='6.1.0.BUILD-SNAPSHOT'
configurations.all {
exclude(group:'org.grails',module:'grails-datastore-simple')
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if(details.requested.group == 'org.grails'
&& details.requested.name.startsWith('grails-datastore')
) {
details.useVersion(gormVersion)
}
}
}
dependencies {
compile "org.springframework.boot:spring-boot-starter-logging"
compile "org.springframework.boot:spring-boot-autoconfigure"
compile "org.grails:grails-core"
compile "org.springframework.boot:spring-boot-starter-actuator"
compile "org.springframework.boot:spring-boot-starter-tomcat"
compile "org.grails:grails-plugin-url-mappings"
compile "org.grails:grails-plugin-rest"
compile "org.grails:grails-plugin-codecs"
compile "org.grails:grails-plugin-interceptors"
compile "org.grails:grails-plugin-services"
compile "org.grails:grails-plugin-datasource"
compile "org.grails:grails-plugin-databinding"
compile "org.grails:grails-plugin-async"
compile "org.grails:grails-web-boot"
compile "org.grails:grails-logging"
compile "org.grails.plugins:cache"
compile "org.grails.plugins:hibernate5"
compile "org.hibernate:hibernate-core:5.1.2.Final"
compile "org.hibernate:hibernate-ehcache:5.1.2.Final"
compile "org.grails.plugins:neo4j:$gormVersion"
compile "org.grails.plugins:views-json"
compile "org.grails.plugins:views-json-templates"
console "org.grails:grails-console"
profile "org.grails.profiles:rest-api"
runtime "com.h2database:h2"
testCompile "org.grails:grails-plugin-testing"
testCompile "org.grails.plugins:geb"
testCompile "org.grails:grails-datastore-rest-client"
testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"
}
bootRun {
jvmArgs('-Dspring.output.ansi.enabled=always')
}
I get this error when creating a date or Enum in Relationship:
Unable to convert java.util.Date to Neo4j Value.
i'm using gorm for neo4j 6.1.0.M1
Update to use Neo4j Driver v1.1.0 and Neo4j v3.1.0
Having this schema:
class Person {
static hasMany = [addresses: Address]
}
class Address {
belongsTo = Address
}
when deleting the person, it should delete all the related addresses, but it's not doing it.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.