2017-08-14 45 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); 
}