バージョンを使用:春・データのNeo4j 4.2.0-BUILD-SNAPSHOT /のNeo4j-OGM 2.0.6-SNAPSHOT私が正しく関係をフェッチするの問題を抱えているのNeo4j OGMとの取引との関係エンティティマッピングの問題を
をエンティティ。 (:C -
- session.query(「MATCH(::: - [HAS_B B] A)
次のフェッチ呼び出しは、(同じトランザクション内で実行される)一貫した結果を返しません)RETURNカウント(B)数として ")リターン1
- session.query(" MATCH(A) - [B:HAS_B] - (:C)の戻りB」)を正しくような関係エンティティを返しますRelationshipModelオブジェクト
- session.query(B.class、 "MATCH(:A) - [b:HAS_B] - (:C)戻り値b ")が返されます。
重要な注釈:すべての操作(作成、フェッチ)が同じトランザクションで行われた場合、正常であるようです。
私は関係エンティティを照会し、私のPOJOに自分でそれをマッピングするためにsession.query(文字列、地図)を使用して回避策を実装することができました。
@NodeEntity
public class A {
public A() {}
public A (String name) {
this.name = name;
}
@GraphId
private Long graphId;
private String name;
@Relationship(type="HAS_B", direction=Relationship.OUTGOING)
private B b;
}
@RelationshipEntity(type="HAS_B")
public class B {
public B() {}
public B (String name, A a, C c) {
this.name = name;
this.a = a;
this.c = c;
}
@GraphId
private Long graphId;
@StartNode
private A a;
@EndNode
private C c;
private String name;
}
@NodeEntity
public class C {
public C() {}
public C (String name) {
this.name = name;
}
@GraphId
private Long graphId;
private String name;
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={MyTest.TestConfiguration.class})
public class MyTest {
@Autowired
private MyBean myBean;
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableNeo4jRepositories("com.nagra.ml.sp.cpm.core.repositories")
public static class TestConfiguration {
@Bean
public org.neo4j.ogm.config.Configuration configuration() {
org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
config.driverConfiguration().setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver");
return config;
}
@Bean
public SessionFactory sessionFactory() {
return new SessionFactory(configuration(), "com.nagra.ml.sp.cpm.model");
}
@Bean
public Neo4jTransactionManager transactionManager() {
return new Neo4jTransactionManager(sessionFactory());
}
@Bean
public MyBean myBean() {
return new MyBean();
}
}
@Test
public void alwaysFails() {
myBean.delete();
myBean.create("1");
try { Thread.sleep(2000); } catch (InterruptedException e) {} //useless
myBean.check("1"); // FAILS HERE !
}
@Test
public void ok() {
myBean.delete();
myBean.createAndCheck("2");
}
}
@Transactional(propagation = Propagation.REQUIRED)
public class MyBean {
@Autowired
private Session neo4jSession;
public void delete() {
neo4jSession.query("MATCH (n) DETACH DELETE n", new HashMap<>());
}
public void create(String suffix) {
C c = new C("c"+suffix);
neo4jSession.save(c);
A a = new A("a"+suffix);
neo4jSession.save(a);
B bRel = new B("b"+suffix, a, c);
neo4jSession.save(bRel);
}
public void check(String suffix) {
//neo4jSession.clear(); //Not working even with this
Number countBRels = (Number) neo4jSession.query("MATCH (:A)-[b:HAS_B]-(:C) WHERE b.name = 'b"+suffix+"' RETURN count(b) as count", new HashMap<>()).iterator().next().get("count");
assertEquals(1, countBRels.intValue()); // OK
Iterable<B> bRels = neo4jSession.query(B.class, "MATCH (:A)-[b:HAS_B]-(:C) WHERE b.name = 'b"+suffix+"' RETURN b", new HashMap<>());
boolean relationshipFound = bRels.iterator().hasNext();
assertTrue(relationshipFound); // FAILS HERE !
}
public void createAndCheck(String suffix) {
create(suffix);
check(suffix);
}
}
確認:他のトランザクションはコミット済みですか? –
はい、Neo4jTransactionManagerのログによれば、最初の2つのトランザクションは正しく(delete()とcreate()呼び出しのためにコミットされます)。 3番目のトランザクション(check())は、アサーション例外のためにロールバックされます。また、ログには、各トランザクションごとに新しいセッションが作成されていることがわかります(「Neo4j OGMトランザクションのための新しいセッションのオープン[[email protected]]」) – tigrou83
どのメソッドを使用しますか? MyBeanのメソッドを@Transactionalでマークしようとしましたが、問題は解決しません。 – tigrou83