私はロールとリソースの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が保存されていないことを除いて起こっています。私は何を取りこぼしたか?