2017-10-15 78 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); 
}