2017-10-15 15 views
0

私はRESTfulシステムでSpring Bootを使い始めています。私は、外部キーid_userとid_permissionのみを持つ中間テーブル "user_permission"と多対多の関係を持つ2つのテーブル "users"と "permissions"を持っています。Spring JPAは中間テーブルにPOST DELETEを実装しています

私はすでにユーザーがGETから "users/{id}/permissions"へのアクセス許可を表示するように管理していますが、POSTで関係を追加する方法やDELETEで削除する方法はまだ分かりません。私はネイティブQuerysでそれをやろうとしましたが、JPAにはINSERTは存在しません。どのようにそれを実装するための任意の提案?

私がしたいのは、user/{id}/permission/{id} のPOSTを使用してリレーションシップを作成し、同じ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); 
} 
関連する問題