我将我的Beans迁移到了CDI,我遇到了Neo4j的奇怪行为,它没有持久化节点(但正确地完成了事务)而没有任何错误迹象。
更令人费解的是,在postCosntructor中调用时添加节点的相同调用在从REST服务调用时不起作用! (g()从另一个未显示的RestService类调用)
@Named
@SessionScoped
public class MyNeo4JController implements Serializable
{
@Inject
private Neo4JGraph neo4jGraph;
public MyNeo4JController()
{
if (neo4jGraph == null)
{
neo4jGraph = new Neo4JGraph();
}
}
@PostConstruct
void postConstruct()
{
f();
}
public void f()
{
getGraphStorage().addNode("F");
}
public void g()
{
getGraphStorage().addNode("G");
}
}
@Singleton
public class Neo4JGraph
{
private static final String FILESYSTEM_DB = "target/neo4j-db";
private GraphDatabaseService graphDb;
public void addNode(String name)
{
Transaction tx = graphDb.beginTx();
try
{
Node newNode = graphDb.createNode();
newNode.setProperty("name", name);
tx.success();
}
catch (Exception e)
{
e.printStackTrace();
tx.failure();
}
finally
{
tx.finish();
}
return true;
}
public void setUp(String rootUuid)
{
if (graphDb == null)
{
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(FILESYSTEM_DB);
indexManager = graphDb.index();
index = indexManager.forNodes("indexNodes");
registerShutdownHook();
setGraphRootUUIDString(rootUuid);
}
}
}
CDI和neo4J之间是否存在某种神秘的不相容性,还是我错过了什么?
编辑:显然我通过将MyNeo4JController中的@SessionScoped更改为@ApplicationScoped缩小了错误,现在节点已经保留。 请注意,在这两种情况下都没有返回错误,但是使用SessionScoped没有添加任何节点!
任何人都知道为什么?因为我不能将这个类保持为ApplicationScoped!
答案 0 :(得分:0)
从SessionScoped bean中删除构造函数将解决问题。使用现有代码,每次创建新会话时都会创建一个新数据库。