当我尝试为SpringData保存一个新节点时,它具有与现有节点相同的属性和关系,它只更新现有节点并且不插入新节点。我用null ID保存它。
有什么问题?
Neo4j 3.0.0
Spring Data 4.1.2
Neo4j OGM 2.0.2
public abstract class ModelObject {
@GraphId
protected Long id;
//getters and setters
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || id == null || getClass() != o.getClass())
return false;
ModelObject entity = (ModelObject) o;
if (!id.equals(entity.id))
return false;
return true;
}
@Override
public int hashCode() {
return (id == null) ? -1 : id.hashCode();
}
}
@RelationshipEntity(type = "COLLECTION")
public class Collection extends ModelObject{
@DateString("yyyy-MM-dd")
private Date acquisitionDate;
@StartNode
private User collector;
@EndNode
private Item item;
private Boolean manual;
private Boolean box;
private Double paidValue;
private String historyAcquisition;
//getters and setters
}
@Service
public class CollectionServiceImpl implements ICollectionService {
@Autowired
private UserRepo userRepo;
@Autowired
private CollectionRepo collectionRepo;
@Autowired
private ItemRepo itemRepo;
@Override
public Iterable<Collection> findByUserId(Integer idUser) {
return collectionRepo.findByCollectorId(idUser);
}
@Override
public boolean addItemCollection(Collection collection, Long itemId) {
try {
Long userId = collection.getCollector().getId();
collection.setCollector(userRepo.findOne(userId, 1));
collection.setItem(itemRepo.findOne(itemId, 1));
collection.setId(null);
collectionRepo.save(collection);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean removeItemCollection(Long collectionId, Long itemId) {
try {
collectionRepo.delete(collectionId);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
@NodeEntity(label="USER")
public class User extends ModelObject {
private String fullName;
private String userName;
private String password;
private Country country;
@DateString(DateUtil.yyyy_MM_dd)
private Date birthDate;
@Relationship(type="FOLLOWING", direction=Relationship.OUTGOING )
private Set<Following> following;
@Relationship(type="COLLECTION", direction=Relationship.OUTGOING )
private List<Collection> collection ;
}
答案 0 :(得分:1)
这可能是因为您明确将id设置为null。 OGM会话跟踪实体引用,并且这种情况无效 - 现在已知的,先前保存的具有空id的实体。为什么不创建一个新的Collection对象来保存?
根据评论更新
SDN / OGM只会在具有相同属性集的两个给定节点之间创建一个关系。在一对节点之间具有相同属性值的关系通常没有多大价值。如您所述,添加时间戳是强制多个关系的一种方法,如果这是图模型所需要的。