java – detached entity passed to persist

We use jhipster as a template for one of our applications.
We have a related entity of User using a OneToOne relationship with extra information as suggested here.

The following code tries to find the user, which already must exist, and then find the related ‘extra’ information, a keyfile in this particular case, -if found- it should update it and if not it should create it and store it in the database.

@PostMapping("/key/{login:" + Constants.LOGIN_REGEX + "}")
    @Timed
    public ResponseEntity<UserKeyFile> updateKeyFile(@PathVariable String login, @RequestPart("file")MultipartFile file) {
        log.debug("peticion REST para actualizar el archivo key del usuario : {}", login);
        File fileSaved = saveToFile(file, login);

        return ResponseUtil.wrapOrNotFound(
            this.userRepository.findOneByLogin(login).flatMap(
                user -> Optional.of(
                    this.userKeyFileRepository.findById(user.getId()).map(userKeyFile -> {
                        userKeyFile.setLastModifiedDate(Instant.now());
                        return userKeyFile;
                    }).orElseGet(() -> {
                        UserKeyFile userKeyFile = new UserKeyFile();
                        userKeyFile.setUser(user);
                        userKeyFile.setRuta(fileSaved.getAbsolutePath());
                        return this.userKeyFileRepository.save(userKeyFile);
                    })
                )
            )
        );
    }

at a first attempt it threw the following error

2018-12-06 09:10:15.825 ERROR 14686 — [ XNIO-2 task-3] m.g.t.aop.logging.LoggingAspect : Exception in com.contoso.web.rest.UserKeyFileResource.updateKeyFile() with cause = ‘org.hibernate.PersistentObjectException: detached entity passed to persist: com.contoso.domain.User’ and exception = ‘detached entity passed to persist: com.contoso.domain.User; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.contoso.domain.User

as it happens, we were using two different repositories and hence the error. We just need to add the org.springframework.transaction.annotation.Transactional annotation

@Transactional
public ResponseEntity updateKeyFile(@PathVariable String login, @RequestPart(“file”)MultipartFile file) {

and now we can persist our related Entity. great!

Anuncios

git – autenticación con llave privada

Si has configurado un servidor local necesitarás configurar al cliente con las llaves que generaste.

Lo único que tenemos que hacer es ejecutar el comando

ssh-add /ruta-a-tu-llave/mi-llave-rsa

nos debe pedir la contraseña (passphrase) de nuestra llave privada.

Con esto ya podríamos sincronizar nuestro repositorio con el servidor remoto

git pull origin master

o

git fetch origin master

Cuando reiniciemos nuestra máquina será necesario volver a ejecutar el comando ‘ssh-add’ e ingresar nuestra contraseña. Si quieres evitar esto, tendrías que remover la contraseña de la llave privada (lo cual no es recomendable) de la siguiente manera

ssh-keygen -p /ruta-a-tu-llave/mi-llave-rsa

ingresar tu calve anterior y dejar en blanco la nueva. Una vez hecho esto debes agregar la siguiente línea al archivo “~/.profile”

ssh-add /ruta-a-tu-llave/mi-llave-rsa &> /dev/null

este comando se ejecutará al iniciar tu sesión y ya no te pedirá el passphrase al intentar sincronizar.


Usuarios Windows

Para agregar tu llave privada en Git Bash, necesitas ejecutar los siguientes comandos.

Primero copiamos nuestra llave privada a la ubicación por default

cp /ruta/llave_privada_rsa ~/.ssh/id_rsa

con esto te pedirá la contraseña de tu llave privada cada vez que ejecutes un comando como “git fetch” (suponiendo que tenga clave).

Si no quieres estar tecleando tu contraseña cada vez, puedes utilizar un agente. Para ello, primero tenemos que levantar el servicio con el siguiente comando

eval `ssh-agent -s`

(notensé las comitas invertidas o backticks)

Una vez iniciado el agente, le pedimos que agregué nuestra llave

ssh-add

al invocarlo sin parámetros, utiliza la llave por default (~/.ssh/id_rsa)

Fuentes:
http://stackoverflow.com/questions/3466626/add-private-key-permanently-with-ssh-add-on-ubuntu
http://serverfault.com/questions/345103/public-key-authentication-ssh-asks-for-passphrase-after-rebooting-local-machin
http://winscp.net/eng/docs/faq_passphrase
http://stackoverflow.com/questions/112396/how-do-i-remove-the-passphrase-for-the-ssh-key-without-having-to-create-a-new-ke
http://stackoverflow.com/questions/4083079/how-to-run-git-ssh-authentication-agent