gpt4 book ai didi

java - Spring Data Neo4j 不会插入新节点,只会更新具有相同属性的现有节点

转载 作者:行者123 更新时间:2023-11-30 07:11:31 28 4
gpt4 key购买 nike

当我尝试为 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)类 User 扩展 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 ;

}

最佳答案

这可能是因为您显式地将 id 设置为 null。 OGM session 跟踪实体引用,这种情况是无效的 - 已知的、先前保存的实体现在具有空 ID。为什么不创建一个新的 Collection 对象来保存?

根据评论进行更新

SDN/OGM 将仅在具有相同属性集的两个给定节点之间创建一种关系。一对节点之间具有相同属性值的关系通常没有多大值(value)。按照您的描述添加时间戳是强制建立多个关系的一种方法(如果您的图形模型需要的话)。

关于java - Spring Data Neo4j 不会插入新节点,只会更新具有相同属性的现有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39169939/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com