2017-08-14 46 views
0

保存我有2個實體,角色和資源。角色可以有很多資源。春季啓動:保存一對多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; 
} 

} 

我試圖保存一個角色對象,它有一個資源。這是我在郵遞員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 =約翰,姓氏=李四和電子郵件= [email protected]資源獲取保存在資源表。

然而,ROLE_ID沒有被自動在資源表保存,所以現在是空(表資源有ROLE_ID設置可空)。我期待,當我做JSON後,數據將被自動保存在角色表,也是資源表。上述這些問題都發生不同之處在於ROLE_ID沒有被保存。我錯過了什麼?

回答

3

變化addRole象下面這樣:

public void addRole(Role role) { 


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

    roleRepository.save(role); 
}