我遇到的问题是Neo4J默默地根据注入Neo4J数据库的类的范围而无法持久化节点,因此我尝试在下面的类中包装Neo4j数据库:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.inject.Named;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.index.IndexManager;
@Named
@Singleton
public class GraphDatabaseMngr
{
private static final String FILESYSTEM_DB = "target/dmsdb";
private org.neo4j.graphdb.GraphDatabaseService graphDb;
/* below is for node indexing */
private IndexManager indexManager;
private Index<Node> index;
public GraphDatabaseMngr()
{
}
@PostConstruct
void postConstruct()
{
setUp();
}
@PreDestroy
void preDestroy()
{
getGraphDb().shutdown();
}
public void setUp()
{
if (getGraphDb() == null)
{
setGraphDb(new GraphDatabaseFactory().newEmbeddedDatabase(FILESYSTEM_DB));
setIndexManager(getGraphDb().index());
setIndex(getIndexManager().forNodes("indexNodes"));
}
}
}
我想知道它是否正常以及是否在@SessionScoped类中注入它是正常的。
到目前为止,该类似乎已正确注入,但是获取和添加节点到neo4j存储不能正常工作,节点没有出现存储但是没有返回错误。
答案 0 :(得分:0)
代码看起来不错,但我更喜欢在@PostConstruct方法中执行init。
@Named
@Singleton
public class GraphDatabaseMngr
{
private static final String FILESYSTEM_DB = "target/dmsdb";
private org.neo4j.graphdb.GraphDatabaseService graphDb;
/* below is for node indexing */
private IndexManager indexManager;
private Index<Node> index;
@PostConstruct
void postConstruct()
{
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(FILESYSTEM_DB);
indexManager = getGraphDb().index();
index = indexManager.forNodes("indexNodes")
}
@PreDestroy
void preDestroy()
{
graphDb.shutdown();
}
// your getters
}
将此bean注入应用程序的其他bean(请求,会话或任何作用域)应该没有问题。 为了诊断节点没有存储的问题:在@ PostConstruct / @ PreDestroy方法中添加一些日志记录,看看这个bean的生命周期是否正常(我很确定)。我似乎更多的是缺少交易的问题(但这应该由Neo4j报告) - 你能验证一下吗?