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
謝謝@nmervaillie,讓我繼續下去。我懷疑有一個bug。我曾嘗試將股票的主要指數添加到股票中,但這導致了使用主鍵創建資產時出現問題。我會再試一次以獲得更多細節。我肯定會將此報告爲一個錯誤。 –
發起的問題[](https://github.com/neo4j/neo4j-ogm/issues/332) –
已修復此錯誤並已在最新快照中提供 – nmervaillie