簡體   English   中英

Spring Data Neo4j持續豐富的關系

[英]Spring Data Neo4j persisting rich relationship

我陷入了一個顯然很普遍的問題,想知道我到底在做什么錯。

我有兩個類型為“ Account”的節點,並希望在它們之間添加“ FRIEND”關系。 但是我不會簡單地在對方賬戶能夠接受或拒絕友誼請求(正常流程)之前添加該關系。 因此,我建立了一種稱為“友誼”的豐富關系。

我的單元測試表明,該請求將被添加到對方帳戶,但不會添加到發起方帳戶。

這是到目前為止我使用的代碼的摘錄:

  @Fetch @RelatedToVia(type = "FRIEND", direction = Direction.BOTH) private Set<Friendship> friends; ... ... public void addFriendshipRequest(Friendship friendship) { this.friends.add(friendship); } public Set<Friendship> getConfirmedFriends() { Set<Friendship> friendships = new HashSet<Friendship>(); for(Friendship f : this.friends) { if(f.getState() == Friendship.State.CONFIRMED) { friendships.add(f); } } return friendships; } public Set<Friendship> getFriendships() { return this.friends; } public Set<Friendship> getFriendRequests() { Set<Friendship> requests = new HashSet<Friendship>(); for(Friendship f : this.friends) { if(f.getState() == Friendship.State.REQUESTED) { requests.add(f); } } return requests; } ... ... } 

現在是我的“友誼”關系實體

import org.springframework.data.neo4j.annotation.EndNode;
import org.springframework.data.neo4j.annotation.GraphId;
import org.springframework.data.neo4j.annotation.RelationshipEntity;
import org.springframework.data.neo4j.annotation.StartNode;
import java.io.Serializable;
import java.util.Date;

@RelationshipEntity(type = "FRIEND")
public class Friendship implements Serializable {

public enum State { REQUESTED, CONFIRMED }

@GraphId
private Long id;

@StartNode
private Account requester;

@EndNode
private Account confirmer;

private State state;

private Date dateOfRequest;

private Date dateOfConfirmation;

public Friendship(Account requester, Account target) {
    this.state = State.REQUESTED;
    this.confirmer = target;
    this.requester = requester;
    this.dateOfRequest = new Date();
}

public Friendship() { }

... getter/setter and stuff ommitted


}

相應的服務

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.neo4j.support.Neo4jTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

import static org.springframework.util.Assert.notNull;

@Service("friendshipService")
@Transactional
@SuppressWarnings("SpringJavaAutowiringInspection")
public class FriendshipServiceImpl implements FriendshipService {

@Autowired
private Neo4jTemplate template;

/**
 * request a friendship with another account
 *
 * @param requester
 * @param target
 */
@Override
public void requestFriendship(Account requester, Account target) {
    notNull(target);
    if(!target.hasFriendshipWith(requester.getId())) {
        target.addFriendshipRequest(new Friendship(requester, target));
        template.save(target);
    }
}

/**
 * change pending state of friendship request to CONFIRMED
 *
 * @param confirmer
 * @param requester
 */
@Override
public void acceptFriendshipRequest(Account confirmer, Account requester) {
    notNull(confirmer);
    for(Friendship f : confirmer.getFriendRequests()) {
        if (f.getRequester().equals(requester)) {
            f.setState(Friendship.State.CONFIRMED);
            f.setDateOfConfirmation(new Date());
        }
    }
    template.save(confirmer);
}

/**
 * declines friendship request by removing it
 *
 * @param confirmer
 * @param requester
 */
@Override
public void declineFriendshipRequest(Account confirmer, Account requester) {
    notNull(confirmer);
    for(Friendship f : confirmer.getFriendRequests()) {
        if (f.getRequester().equals(requester)) {
            confirmer.getFriendships().remove(f);
        }
    }
    template.save(confirmer);
}

}

我的簡單單元測試可以檢查一切是否順利...

@ContextConfiguration({"classpath:/test-applicationContext.xml"})
@SuppressWarnings("SpringJavaAutowiringInspection")
@RunWith(SpringJUnit4ClassRunner.class)
public class TestFriendships {

@Autowired
Neo4jTemplate template;

@Autowired
private AccountDetailsService accountDetailsService;

@Autowired
private FriendshipService friendshipService;

private Account myself;
private Account friendlyHans;
private Account unfriendlyPeter;


@Rollback(false)
@BeforeTransaction
public void cleanUpGraph() {
    Neo4jHelper.cleanDb(template);
}

@Before
public void prepareTests() {
    myself = accountDetailsService.createAccount(new Account("itsme"));
    friendlyHans = accountDetailsService.createAccount(new Account("butterflyhans"));
    unfriendlyPeter = accountDetailsService.createAccount(new Account("evilmindedpeter"));
}

@Test
@Transactional
public void testSendFriendshipRequest() throws Exception {
    friendshipService.requestFriendship(myself, friendlyHans);
    assertThat(friendlyHans.getFriendRequests().size(), is(1));
    assertThat(myself.getFriendships().size(), is(1));
    assertThat(friendlyHans.getFriendRequests().iterator().next().getRequester(), is(myself));
    assertThat(friendlyHans.getFriendRequests().iterator().next().getConfirmer(), is(friendlyHans));
    assertThat(friendlyHans.getFriendRequests().iterator().next().getState(), is(Friendship.State.REQUESTED));
}

因此,現在當我調用FriendshipService.requestFriendship(myself,friendlyHans)時,我假設兩個帳戶之間都將建立一個關系,並且當我指出兩者的方向時,我進一步假設,當我檢查對方的友誼列表時,也會與第一個帳戶有關。 不幸的是,此(assertThat(myself.getFriendships()。size(),is(1));)失敗,因為集合為空。

您能指出,我在這里做錯了嗎? 我在最近的幾天嘗試過-不幸的是沒有成功。 也許這只是一件小事。 但是我找不到它。

哦,我使用的版本號是

  • Spring Data Neo4j 2.1.0。發布
  • Spring Core 3.2.0。發布
  • Neo4j 1.8.1

提前謝謝了。

您必須從數據庫中讀回我的對象才能更新關系字段,否則,您只是在創建新關系之前使用已讀取的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM