Spring 引导:保存一对多 json 请求,外键不会自动保存

Spring Boot: Saving a one to many json request, foreign key is not saved automatically

我有 2 个实体,角色和资源。一个角色可以拥有很多资源。

@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;
}

}

我正在尝试保存其中包含资源的角色 object。这是我在postman.json中的body。

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

http post 调用 postman:

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);
}

}

角色库

public interface RoleRepository extends CrudRepository<Role, Integer> {

}

角色服务

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);
}
}

发生的事情是,业务分析师角色保存在角色 table 的角色名称字段中。所述行的 ID 是自动生成的。同时,firstName = John,lastName = Doe 和 email = John@Doe.com 的资源被保存在资源 table 中。

但是,role_id 不会自动保存在资源 table 中,所以现在它为空(table 资源已将 role_id 设置为可为空) .我原以为当我执行 json post 时,数据将自动保存在角色 table 和资源 table 中。除了 role_id 没有被保存之外,这两种情况都在发生。我错过了什么?

像下面这样更改 addRole:

public void addRole(Role role) {


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

    roleRepository.save(role);
}