0

他のいくつかのエンティティとの関係を含む Node エンティティを永続化しています。この永続化は、一度に 1 つずつ実行すると問題なく動作しますが、これを同時に実行すると、org.neo4j.ogm.mapper.EntityGraphMapper で NPE が発生します。

java.lang.NullPointerException: null
at org.neo4j.ogm.mapper.EntityGraphMapper.updateRelationship(EntityGraphMapper.java:618) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.mapRelationshipEntity(EntityGraphMapper.java:481) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.link(EntityGraphMapper.java:330) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntityReferences(EntityGraphMapper.java:265) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntity(EntityGraphMapper.java:158) ~[neo4j-ogm-1.1.2.jar:na]

これが私のNodeエンティティの核心です:

@NodeEntity
public class Post {
   @Relationship(type = "POST_BY_USER", direction = Relationship.INCOMING)
   User poster;

   @Relationship(type = "POST_TO_STORE", direction = Relationship.OUTGOING)
   Store toStore;

   @Relationship(type = "POST_PRODUCT", direction = Relationship.INCOMING)
  Product product;

  @Relationship(type = "POST_INSPIRATION", direction = Relationship.INCOMING)
  Product_Inspiration productInspiration;
}

(@Transactional)でGraphRepositoryを使用することと、トランザクションでセッションを使用することの両方を永続化しようとしましたが、両方のシナリオで、同時実行で同じ問題が発生しました。

どうすればこの問題を解決できるか教えてください。同時リクエストを砲撃するとこの問題が発生するため、これがコードフロー自体に関係しているかどうかはわかりません。

同時リクエストを送信するコードについて Vince から要求されたように、私は Play で axon cqrs フレームワークを使用しており、複数の同時リクエストを Play アプリケーションの REST API に送信します。これは、axon を介して、postProduct メソッドを介して Neo4j への同時書き込みを呼び出します。ここに私の書き込みコードがどのように見えるかがあります。

   def postProduct(productId: ProductId, product2Post: Product2Post):     Post = workNLogOnFail(
  doPost(productId, product2Post),
  "postProduct"
  )

  private def doPost(productId: ProductId, product2Post: Product2Post): Post = {
  val product: Product = configureDomainEntity(productId, product2Post)
  val storeId: StoreId = storeService1.findOrCreateStore(product2Post.host)
  val post: Post = commonService.configurePost(product2Post.commonData2Post.relationInfo, isProduct = true) { (x: Post) =>
  x.setToStore(storeService1.updateStoreForProductPost(x, storeId))
  x.setProduct(product)
}
val persistedPost = xtPostProduct(product, post)
commonService.addUrlMapping(product2Post.commonData2Post, productId.identifier)
persistedPost
}
private def xtPostProduct(product: Product, post: Post): Post = {
Try {
  val tx: Transaction = session.beginTransaction()
  logger.debug(s"saving product")
  //      session.save(product)
  logger.debug(s"updating user")
  //      session.save(post.getPoster)
  logger.debug(s"posting product")
  session.save(post)
  tx.commit()
  post
  }.get
  }

メソッドxtPostProductのセッションだけでなく、GraphRepositoryで@Transanctionalを試しました。

4

1 に答える 1

0

理解した。問題は、春の DI 配線のために、私のセッションまたはリポジトリで使用されるセッションが作業単位ごとではないことでした。Axon を介してデータベース操作を呼び出しているため、「セッション」のスコープでセッション Bean を使用する通常の方法では機能しません。処理する必要がある各 Axon イベントのセッションを手動で作成することに戻りました。本質的に私にとっては、それが私の仕事の単位です!!.

于 2015-09-17T12:49:55.167 に答える