2015-05-15 56 views
2

我在與關係RelationshipEntity不持久

@RelationshipEntity(type = RelTypes.Tag.TAG_ON_OBJECT_EVALUATION) 
public class TagOnObjectEvaluation 
{ 
    @StartNode 
    private Mashup taggableObject; 

    @EndNode 
    private Tag tag; 

    // Other fields, getters and setters 
} 

在兩個所涉及的實體(MashupTag)的問題,我有此字段(反方向)

@RelatedToVia(type = RelTypes.Tag.TAG_ON_OBJECT_EVALUATION, 
     direction = Direction.INCOMING /*Direction.OUTGOING*/) 
    private Set<TagOnObjectEvaluation> tagOnObjectEvaluations = 
     new HashSet<TagOnObjectEvaluation>(); 

然後,我有各種服務級別管理Tag,MashupTagOnObjectEvaluation。現在被測試的類是後者。 注意:該名稱有點令人困惑,這是以前編碼器的遺留問題,您可以將DAO作爲服務讀取。此外GenericNeo4jDAOImpl(再次,它讀成GenericServiceNeo4jImpl)簡單地定義爲實體管理(create()find()update()delete()fetch()

@Service 
public class TagOnObjectEvaluationDAONeo4jImpl extends 
    GenericNeo4jDAOImpl<TagOnObjectEvaluation> implements 
    TagOnObjectEvaluationDAO 
{ 
    @Autowired 
    private TagOnObjectEvaluationRepository repository; 

    public TagOnObjectEvaluationDAONeo4jImpl() 
    { 
    super(TagOnObjectEvaluation.class); 
    } 

    public TagOnObjectEvaluationDAONeo4jImpl(
     Class<? extends TagOnObjectEvaluation> entityClass) 
    { 
    super(entityClass); 
    } 

    @Override 
    public TagOnObjectEvaluation create(TagOnObjectEvaluation t) 
    { 
    Transaction tx = template.getGraphDatabaseService().beginTx(); 
    TagOnObjectEvaluation savedT = null; 
    try 
    { 
     // This is to enforce the uniqueness of the relationship. I know it can fail in many ways, but this is not a problem ATM 
     savedT = 
      template.getRelationshipBetween(
       t.getTaggableObject(), t.getTag(), 
       TagOnObjectEvaluation.class, 
       RelTypes.Tag.TAG_ON_OBJECT_EVALUATION); 
     if (savedT == null) 
     savedT = super.create(t); 
     tx.success(); 
    } 
    catch (Exception e) 
    { 
     tx.failure(); 
     savedT = null; 
    } 
    finally 
    { 
     tx.finish(); 
    } 
    return savedT; 
    } 
} 

似乎非常簡單到現在的標準方法。 但是當我試圖堅持一個RelationshipEntity實例時,我遇到了很多問題。

@Test 
    public void testRelationshipEntityWasPersisted() 
    { 
    TagOnObjectEvaluation tagOnObjectEvaluation = new TagOnObjectEvaluation(taggedObject, tag); 

    tagOnObjectEvaluationDao.create(tagOnObjectEvaluation); 
    assertNotNull(tagOnObjectEvaluation.getId()); 
    LOGGER.info("TagOnObjectEvaluation id = " + tagOnObjectEvaluation.getId()); 

    tagDao.fetch(tag); 
    assertEquals(1, tag.getTaggedObjectsEvaluations().size()); 
    } 

的最後一次測試失敗:大小爲0而不是1。此外,雖然似乎實體存儲正確的(它得到一個id分配),如果我以後航行的分貝有根本沒有跟蹤。 我也嘗試以不同的方式添加關係,使用涉及節點的集合; F.E.

tag.getTaggedObjectsEvaluations().add(tagOnObjectEvaluation); 
tagDao.update(tag); 

但沒有任何改進。

+1

也許我錯了,但我認爲在你的'Mashape'實體中,方向應該是'OUTOING'。你可以試試嗎? – troig

+1

你是對的,讓它成爲答案,以便我可以接受它併爲正在發生的事情添加評論 – tigerjack89

+1

爲什麼在標題中使用***Ŗ***? –

回答

1

您需要更改的關係方向在實體Mashape,(對應於你的@RelationshipEntityTagOnObjectEvaluation@StartNode實體)。

@NodeEntity 
class Mashape { 

    // ... 
    @RelatedToVia(type = RelTypes.Tag.TAG_ON_OBJECT_EVALUATION, direction = Direction.OUTGOING) 
    private Set<TagOnObjectEvaluation> tagOnObjectEvaluations = new HashSet<TagOnObjectEvaluation>();  

} 

根據@RelatedToViaspecificationsspring-data-neo4j註釋只需指向,默認情況下方向OUTGOING,所以你真的不需要指定在這種情況下的方向。這也應該是正確的:

@RelatedToVia(type = RelTypes.Tag.TAG_ON_OBJECT_EVALUATION) 
    private Set<TagOnObjectEvaluation> tagOnObjectEvaluations = new HashSet<TagOnObjectEvaluation>();  

希望它有幫助。

+0

是的,我似乎倒過來了。從我看到的感謝你的建議,當你使用'@ RelationshipEntity'類時,相關實體應該引用與'@RelatedToVia(direction = Direction.X)'的關係,其中X = OUTGOING實體在@ RelationshipEntity類中標記爲@ StartNode,而對於用@ EndNode標註的實體,X = INCOMING。你知道爲什麼嗎?這與真實情況似乎完全相反。 – tigerjack89

+1

是的,我認爲它在你如何代表你的模型中的關係。對我而言,這是大多數情況下的「邏輯」順序。很高興幫助你! – troig

+1

很快見到你:D – tigerjack89