Reputation: 2837
Its been a week banging my head over this but still cannot seem to find a solution. I am using spring-data-neo4j maven artifact and the following lines of code which causes this issue:
/**
*
*/
@Autowired
private UserRepository userRepository;
@Transactional
public void addClassDescriptor(User user, ClassDescriptor classDescriptor) {
Project project = user.getDefaultProject();
ManagedFieldAccessorSet<ClassDescriptor> accessorSet = (ManagedFieldAccessorSet<ClassDescriptor>) project.getClassDescriptors();
accessorSet.add(classDescriptor);
/*
* Save the user object after updating the set
*/
userRepository.save(user);
}
When executing the method it gives the following error at
accessorSet.add(classDescriptor);
Stacktrace:
org.neo4j.graphdb.NotInTransactionException
at org.neo4j.kernel.impl.persistence.PersistenceManager.getResource(PersistenceManager.java:252)
at org.neo4j.kernel.impl.persistence.PersistenceManager.nodeCreate(PersistenceManager.java:155)
at org.neo4j.kernel.impl.core.NodeManager.createNode(NodeManager.java:270)
at org.neo4j.kernel.EmbeddedGraphDbImpl.createNode(EmbeddedGraphDbImpl.java:317)
at org.neo4j.kernel.EmbeddedGraphDatabase.createNode(EmbeddedGraphDatabase.java:103)
at org.springframework.data.neo4j.support.DelegatingGraphDatabase.createNode(DelegatingGraphDatabase.java:82)
at org.springframework.data.neo4j.support.mapping.EntityStateHandler.useOrCreateState(EntityStateHandler.java:115)
at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.write(Neo4jEntityConverterImpl.java:145)
at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister$CachedConverter.write(Neo4jEntityPersister.java:176)
at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:238)
at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.persist(Neo4jEntityPersister.java:227)
at org.springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:295)
at org.springframework.data.neo4j.fieldaccess.AbstractNodeRelationshipFieldAccessor.getOrCreateState(AbstractNodeRelationshipFieldAccessor.java:97)
at org.springframework.data.neo4j.fieldaccess.AbstractNodeRelationshipFieldAccessor.createSetOfTargetNodes(AbstractNodeRelationshipFieldAccessor.java:89)
at org.springframework.data.neo4j.fieldaccess.OneToNRelationshipFieldAccessorFactory$OneToNRelationshipFieldAccessor.setValue(OneToNRelationshipFieldAccessorFactory.java:66)
at org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet.updateValue(ManagedFieldAccessorSet.java:90)
at org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet.update(ManagedFieldAccessorSet.java:78)
at org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet.add(ManagedFieldAccessorSet.java:104)
My entities are as follows : ( User.java )
@GraphId
private Long id;
@RelatedTo(elementClass = Project.class)
@Fetch
private Set<Project> projects;
( Project.java )
@GraphId
private Long id;
/**
*
*/
@RelatedTo(elementClass = ClassDescriptor.class)
@Fetch
private Set<ClassDescriptor> classDescriptors;
/**
*
*/
private boolean defaultProject;
Please help ! Attached is the dependency tree.
Upvotes: 1
Views: 3761
Reputation: 750
You must protect the Transaction in a try chach...
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;
public class App {
static Node firstNode = null;
static GraphDatabaseService graphDb = null;
public static void main(String[] args) {
System.out.println("Start ...");
graphDb = ConnectNeo4j.initDB();
Transaction tx = graphDb.beginTx();
try {
firstNode = graphDb.createNode();
firstNode.setProperty("message", "Es Geht!");
System.out.println(firstNode.getProperty("message"));
tx.success();
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
tx.close();
}
}
}
Upvotes: 0
Reputation: 168
I found when adding relations using a collection operation, as well as the @Transactional annotation you need to obtain a reference to the GraphDatabaseService and explicitly begin and end a transaction:
@Autowired
private GraphDatabaseService graphDb;
@Transactional
public void addRelation() {
Transaction tx = graphDb.beginTx();
...
tx.success(); //or tx.failure();
tx.finish();
}
Upvotes: 2
Reputation: 219
Abhi,
If it is happening consistently then I think you service is not a proper bean. How do you wire up your stuff?
Are you using simple or advanced mode (AspectJ)?
The stuff you have posted looks fine and simple, so I can't see why it wouldn't work...
Regards,
Lasse
Upvotes: 1