2017-10-15 81 views
0

我開始使用Spring引導RESTful系統上刪除。我有兩個表「用戶」,並且有一箇中間表「user_permission」,它不僅具有外鍵id_user和id_permission一個多一對多的關係「權限」。春天JPA實現POST在中間表

我已經設法讓它顯示用戶從GET到「users/{id}/permissions」的權限,但我仍然不知道如何添加與POST的關係或使用DELETE刪除它。我試過用原生Querys來做,但我讀到JPA中不存在INSERT。有關如何實施它的任何建議?

我想要做的是使用POST在用戶/ {id} /權限/ {id} 上創建關係,並使用具有相同url的DELETE刪除該關係。

這是我的用戶控制器:

@RestController 
@RequestMapping("/permisos-api") 
public class UsuarioController { 

@Autowired 
UsuarioRepository userRepository; 

@GetMapping("/usuarios") 
public List<Usuario> getAllUsuarios() { 
    return userRepository.findAll(); 
} 

@GetMapping("/usuarios/{id}") 
public ResponseEntity<Usuario> getUsuarioById(@PathVariable(value = "id") 
Integer userId) { 
    Usuario user = userRepository.findOne(userId); 
    if(user == null) { 
     return ResponseEntity.notFound().build(); 
    } 
    return ResponseEntity.ok().body(user); 
} 

@PostMapping("/usuarios") 
public Usuario createUsuario(@Valid @RequestBody Usuario user) { 
    return userRepository.save(user); 
} 

@PutMapping("/usuarios/{id}") 
public ResponseEntity<Usuario> updateUsuario(@PathVariable(value = "id") 
Integer userId, @Valid @RequestBody Usuario 
userDetails) { 
    Usuario user = userRepository.findOne(userId); 
    if(user == null) { 
     return ResponseEntity.notFound().build(); 
    } 
    user.setNombre(userDetails.getNombre()); 
    user.setStatus(userDetails.getStatus()); 

    Usuario updatedUser = userRepository.save(user); 
    return ResponseEntity.ok(updatedUser); 
} 

@DeleteMapping("/usuarios/{id}") 
public ResponseEntity<Usuario> deleteUusario(@PathVariable(value = "id") 
Integer userId) { 
    Usuario user = userRepository.findOne(userId); 
    if(user == null) { 
     return ResponseEntity.notFound().build(); 
    } 

    userRepository.delete(user); 
    return ResponseEntity.ok().build(); 
} 

@GetMapping("/usuarios/{id}/permisos") 
public ResponseEntity<Collection<Permiso>> 
getPermisosOfUsuario(@PathVariable(value = "id") Integer userId) { 
    Usuario user = userRepository.findOne(userId); 
    if(user == null) { 
     return ResponseEntity.notFound().build(); 
    } 
    return ResponseEntity.ok().body(user.getPermisoCollection()); 
} 

} 

感謝。

+0

你甚至知道JPA是什麼嗎?關係通過適當的實體映射進行自動處理 – Antoniossss

+0

[JPA ManyToMany persist]的可能重複(https://stackoverflow.com/questions/31534871/jpa-manytomany-persist) – Antoniossss

+0

恐怕您正在做大量冗餘工作。隨着JPA可以在@RepositoryRestResource註釋添加到您的JPA庫和Spring自動生成所有CRUD方法。 –

回答

0

我已經使用對象作爲@JB Nizet提到解決我的問題。 這就是它的工作原理:

@PostMapping("/usuarios/{idUsuario}/permisos") 
public Usuario addPermisoUsuario(@PathVariable(value = "idUsuario") Integer 
userId, @RequestBody Permiso permiso) { 
    Usuario user = userRepository.findOne(userId); 
    Permiso permisoExistente = 
    permisoRepository.findOne(permiso.getIdPermiso()); 
    user.getPermisoCollection().add(permisoExistente); 
    return userRepository.save(user); 
} 

@DeleteMapping("/usuarios/{idUsuario}/permisos/{idPermiso}") 
public Usuario deletePermisoUsuario(@PathVariable(value = "idUsuario") 
Integer userId, @PathVariable(value = "idPermiso") 
Integer permisoId, @RequestBody Permiso permiso) { 
    Usuario user = userRepository.findOne(userId); 
    Permiso permisoEliminar = permisoRepository.findOne(permisoId); 
    user.getPermisoCollection().remove(permisoEliminar); 
    return userRepository.save(user); 
}