banging my head on this one…
I’ve a piece of code like this which wraps JPA Entities into vertices and which wraps JPA Relationships into Edges :
public GraphTraversalSource modelGraphFromMetamodelGraph(org.jgrapht.Graph<MetamodelVertex, FieldEdge<MetamodelVertex>> entityMetamodelGraph) {
log.info("Creating model vertex");
GraphTraversalSource gTS = this.graphTraversalSource.getGraph();
TransactionTemplate tpl = new TransactionTemplate(sourcePlatformTxManager);
tpl.setReadOnly(true);
tpl.executeWithoutResult(status -> {
createVertices(entityMetamodelGraph, gTS);
createEdges(entityMetamodelGraph, gTS);
}); return gTS;
}
That works totally fine.
Unfortunately this code throws OOM on big databases thus I’m trying to ‘Stream’ it and make Transactions/Sessions more atomic.
But unfortunately, when I’m modifying this piece of code like this:
public GraphTraversalSource modelGraphFromMetamodelGraph(org.jgrapht.Graph<MetamodelVertex, FieldEdge<MetamodelVertex>> entityMetamodelGraph) {
log.info("Creating model vertex");
GraphTraversalSource gTS = this.graphTraversalSource.getGraph();
createVertices(entityMetamodelGraph, gTS);
createEdges(entityMetamodelGraph, gTS);
return gTS;
}
private void createVertices(Graph<MetamodelVertex, FieldEdge<MetamodelVertex>> entityMetamodelGraph, GraphTraversalSource graphTraversalSource) {
log.info("Creating model Vertex");
TransactionTemplate tpl = new TransactionTemplate(sourcePlatformTxManager);
tpl.setReadOnly(true);
tpl.executeWithoutResult(status ->*/
createVertices(entityMetamodelGraph.vertexSet(), graphTraversalSource);
);
}
void createEdges(Graph<MetamodelVertex, FieldEdge<MetamodelVertex>> entityMetamodelGraph, GraphTraversalSource graphTraversalSource) {
log.info("Creating model edges");
TransactionTemplate tpl = new TransactionTemplate(sourcePlatformTxManager);
tpl.setReadOnly(true);
tpl.executeWithoutResult(status ->
modelGraphEdgeBuilder.createEdges(graphTraversalSource, entityMetamodelGraph);
);
}
I face a lovely
[ERROR] net.osgiliath.FakerProcessingIT.givenFedGraphWhenEntityProcessorAndSequenceProcessorIsCalledThenTargetDatabaseIsPopulatedExcludingCyclicPathAndFieldsAreTransformed -- Time elapsed: 0.079 s <<< ERROR!
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: net.osgiliath.datamigrator.sample.domain.JhiUser.jhiAuthorities: could not initialize proxy - no Session
at org.hibernate.collection.spi.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:634)
at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:217)
at org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:613)
at org.hibernate.collection.spi.AbstractPersistentCollection.read(AbstractPersistentCollection.java:136)
at org.hibernate.collection.spi.PersistentSet.iterator(PersistentSet.java:166)
at java.base/java.util.Spliterators$IteratorSpliterator.estimateSize(Spliterators.java:1959)
at java.base/java.util.Spliterator.getExactSizeIfKnown(Spliterator.java:414)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:508)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
at org.apache.tinkerpop.gremlin.process.traversal.Traversal.forEachRemaining(Traversal.java:278)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:667)
at net.osgiliath.migrator.core.graph.TinkerpopModelGraphEdgeBuilder.createEdges(TinkerpopModelGraphEdgeBuilder.java:68)
Any idea of why this thing is happening? Any potential fix?
Thank you in advance