2017-03-05 48 views
1

從Neo4j的檢索實體掙扎,我有以下簡單的繼承層次使用一個主索引

abstract class Entity { 

     @GraphId 
     Long id; 

     public Long getId() { 
      return id; 
     } 
    } 


    @NodeEntity 
    public class Asset extends Entity { 

     String name; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Index(unique=true, primary=true) 
     String primaryKey; 

     public String getPrimaryKey() { 
      return primaryKey; 
     } 

     public void setPrimaryKey(String primaryKey) { 
      this.primaryKey = primaryKey; 
     } 
    } 

@NodeEntity 
public class Equity extends Asset { 

    @Override 
    public String toString() { 
     return "Equity [name=" + name + ", primaryKey=" + primaryKey + "]"; 
    } 

} 

而且我的倉庫被實現爲:

public class AssetServiceImpl extends GenericService<Asset> implements AssetService { 

    @Override 
    public Asset findPK(String primaryKey) 
    { 
     return session.load(getEntityType(), primaryKey, 0); 
    } 

    @Override 
    public Asset create(Asset asset) { 

      Asset foundAsset = findPK(asset.getPrimaryKey()); 
      if (foundAsset == null) 
      { 
       session.save(asset, 0); 
       return findPK(asset.getPrimaryKey()); 
      } 
      else 
      { 
       return foundAsset; 
      } 
    } 

    @Override 
    public Class<Asset> getEntityType() { 
     return Asset.class; 
    } 
} 

我測試用簡單的應用程序:

public class App 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello World!");   

     AssetService assetService = new AssetServiceImpl(); 

     Equity equity1 = new Equity(); 
     equity1.setName("British Airways"); 
     equity1.setPrimaryKey("PK1"); 

     assetService.create(equity1); 

     System.out.println(assetService.findPK("PK1"));  
     return;  
    } 
} 

當我運行應用程序時,Equity按照預期在數據庫中與所有道具erties和標籤來表示繼承如人們所期望的那樣。問題是findPK方法只會返回null。所以,用乾淨的DB開始我

  • 找,不覺得OK
  • 再次確定
  • 尋找它創建和並不覺得問題

日誌記錄顯示約束的創造,公平的創造以及嘗試找到它。面對這一切看起來不錯,但沒有發現!我非常感謝這方面的任何提示,我確信我錯過了一些愚蠢的東西。

Hello World! 
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Starting Post-processing phase 
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Building annotation class map 
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Building interface class map for 14 classes 
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Post-processing complete 
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - 14 classes loaded in 80728985 nanoseconds 
[main] INFO org.neo4j.ogm.service.DriverService - Using: [org.neo4j.ogm.drivers.bolt.driver.BoltDriver] 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: CALL db.constraints() with params {} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: CALL db.indexes() with params {} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: DROP CONSTRAINT ON (asset:Asset) ASSERT asset.primaryKey IS UNIQUE with params {} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: CREATE CONSTRAINT ON (asset:Asset) ASSERT asset.primaryKey IS UNIQUE with params {} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: MATCH (n) WHERE n.primaryKey = { id } RETURN n with params {id=PK1} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: UNWIND {rows} as row CREATE (n:`Equity`:`Asset`) SET n=row.props RETURN row.nodeRef as ref, ID(n) as id, row.type as type with params {rows=[{nodeRef=-1647809929, type=node, props={name=British Airways, primaryKey=PK1}}]} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: MATCH (n) WHERE n.primaryKey = { id } RETURN n with params {id=PK1} 
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: MATCH (n) WHERE n.primaryKey = { id } RETURN n with params {id=PK1} 
null 

回答

1

不幸的是,這是OGM中的一個錯誤。您可以在此提出問題:https://github.com/neo4j/neo4j-ogm/issues

作爲解決方法,您可以在Equity類中聲明您的索引,因爲OGM僅掃描主索引層次結構中的葉類。

+0

謝謝@nmervaillie,讓我繼續下去。我懷疑有一個bug。我曾嘗試將股票的主要指數添加到股票中,但這導致了使用主鍵創建資產時出現問題。我會再試一次以獲得更多細節。我肯定會將此報告爲一個錯誤。 –

+0

發起的問題[](https://github.com/neo4j/neo4j-ogm/issues/332) –

+0

已修復此錯誤並已在最新快照中提供 – nmervaillie