2017-08-14 8 views
0

私はロールとリソースの2つのエンティティを持っています。役割は、多くのリソースを持つことができます。Spring Boot:1つまたは複数のjson要求を保存すると、外部キーは自動的に保存されません。

@Entity 
public class Resource { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 

@Column(name="firstname") 
private String firstName; 

@Column(name="lastname") 
private String lastName; 

private String email; 

@ManyToOne 
@JoinColumn(name="roleId", nullable = false) 
private Role role; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 


public Role getRole() { 
    return role; 
} 

public void setRole(Role role) { 
    this.role = role; 
} 

} 

@Entity 
public class Role { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 

@Column(name = "rolename") 
private String roleName; 

@OneToMany(mappedBy = "role", cascade = CascadeType.ALL) 
private List<Resource> resources; 

public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 

public String getRoleName() { 
    return roleName; 
} 
public void setRoleName(String roleName) { 
    this.roleName = roleName; 
} 
public List<Resource> getResources() { 
    return resources; 
} 
public void setResources(List<Resource> resources) { 
    this.resources = resources; 
} 

} 

リソースを持つRoleオブジェクトを保存しようとしています。これは郵便配達員の私のjsonの体です。郵便配達中

{ 
"roleName" : "Business Analyst", 
"resources" : [{ 
    "firstName" : "John", 
    "lastName" : "Doe", 
    "email" : "[email protected]" 
}] 
} 

HTTPのPOST呼び出し:

http://localhost:8080/app/admin/roles/role 

役割コントローラ

@RestController 
@RequestMapping(value="/admin/roles") 
public class RoleController { 
@Autowired 
private RoleService roleService; 

private static final Logger log = LoggerFactory.getLogger(RoleController.class); 

@RequestMapping(value="/role", method = RequestMethod.POST) 
public ResponseEntity<?> addRole(@RequestBody Role role, UriComponentsBuilder ucBuilder){ 
    log.info("Adding Role {}" + role); 
    log.info("Adding Rolename:" + role.getRoleName()); 

    roleService.addRole(role); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setLocation(ucBuilder.path("/admin/roles/role/{id}").buildAndExpand(role.getId()).toUri()); 
    return new ResponseEntity<String> (headers,HttpStatus.CREATED); 
} 

@RequestMapping(value="role", method = RequestMethod.GET) 
public ResponseEntity<List<Role>> listAllRoles(){ 
    List<Role> roles = roleService.getAllRoles(); 
    return new ResponseEntity<List<Role>>(roles, HttpStatus.OK); 
} 

} 

RoleRepository

public interface RoleRepository extends CrudRepository<Role, Integer> { 

} 

RoleService

public interface RoleService { 

public void addRole(Role role); 


} 

RoleServiceImpl

@Service 
public class RoleServiceImpl implements RoleService { 

@Autowired 
private RoleRepository roleRepository; 

@Override 
public void addRole(Role role) { 
    roleRepository.save(role); 
} 
} 

起こっていただきましたで、役割のビジネスアナリストは、役割テーブルのフィールドのroleNameに保存取得します。前記行のIDは自動生成されます。同時に、firstName = John、lastName = Doe、email = [email protected]のリソースはリソーステーブルに保存されます。

ただし、role_idはリソーステーブルに自動的に保存されないため、nullになります(テーブルのリソースにはrole_idがnullableに設定されています)。私はjson投稿を行うと、データがRoleテーブルとResourceテーブルに自動的に保存されることを期待していました。これらの両方は、role_idが保存されていないことを除いて起こっています。私は何を取りこぼしたか?

答えて

3

以下のように変更addRole:

public void addRole(Role role) { 


    for(Resource resource: role.getResources()){   
     resource.setRole(role); 
    } 

    roleRepository.save(role); 
} 
関連する問題