una relaciones para pagina oficial modificar grafos grafo downloads datos crear como bases java neo4j spring-data-neo4j

java - relaciones - ¿Cómo puedo actualizar la entidad de nodos o nodos en los datos de primavera neo4j?



neo4j downloads (3)

En los datos de Spring neo44 tenemos repository.save(entity) , pero por ejemplo cuando mi propiedad UserEntity (email) cambió, no sé cómo actualizar la misma.

Intenté también con la plantilla neo4j , pero la entidad de salvar con el ID de nodo existente provocó la reversión siguiente.

org.springframework.dao.InvalidDataAccessApiUsageException: New value must be a Set, was: class java.util.ArrayList; nested exception is java.lang.IllegalArgumentException: New value must be a Set, was: class java.util.ArrayList at org.springframework.data.neo4j.support.Neo4jExceptionTranslator.translateExceptionIfPossible(Neo4jExceptionTranslator.java:43) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)

¿Cómo podemos actualizar node o nodeentity?

public void updateUserNode(UserEntity user) { try{ UserEntity updatedUser = this.getUserByUserId(user.getUserId());//finding node with user id/// updatedUser.setEmail(user.getEmail()); updatedUser.setImageId(user.getImageId()); updatedUser.setFirstname(user.getFirstname()); updatedUser.setLastname(user.getLastname()); //System.out.println("Deleting "); //userRepository.delete(del); System.out.println("UPDATING "); // with existing Id, you can not save it again/, or update updatedUser = userRepository.save(updatedUser); }catch(Exception e){ e.printStackTrace(); } //return }


Tienes que insertar el .save () dentro de una transacción.

Como ejemplo:

final org.neo4j.graphdb.Transaction tx = this.neoTemplate.getGraphDatabaseService().beginTx(); try { updatedUser = userRepository.save(updatedUser); tx.success(); } finally { tx.finish(); }


En su objeto de dominio UserEntity , ¿está almacenando alguna relación? Asegúrese de que estén declarados como Set<T> y no como Iterable<T> :

De: http://static.springsource.org/spring-data/data-graph/snapshot-site/reference/html/#reference:programming_model:relationships:relatedto

"También es posible tener campos que hagan referencia a un conjunto de entidades de nodo (1: N). Estos campos vienen en dos formas, modificables o de solo lectura. Los campos modificables son del tipo Establecido, y los campos de solo lectura son Iterables, donde T es una clase @ NodeEntity-annotated ".

Sospecho que tu constructor predeterminado está creando una ArrayList ...


Como está utilizando SDN, no debería necesitar iniciar / confirmar manualmente ninguna transacción.

Supongamos que su clase de User ve así

@NodeEntity(label="User) public class User extends DomainObject{ @Property(name = "email") private String email; //getter and setter }

y su UserRepository es similar a esto:

public interface UserRepository extends GraphRepository<User> { //maybe this is already right at hand by SDN and thus redundant? @Query("MATCH (u:User {email:{email}}") public User findByEmail(@Param("email") String email) }

Entonces puede usar un @Transactional en una clase UserService :

@Component @Transactional public class UserService { @Autowired private UserRepository userRepository; public void updateEmail(String email) { User user = userRepository.findByEmail(email); if (user == null) return; //or throw... user.setEmail(email); userRepository.save(user); } }