我有两个实体类,Country并且Language具有双向一对多关系。
Country
Language
以下是实体类:
@Entity @Table(name = "COUNTRY") public class Country { @Id @GeneratedValue @Column(name = "COUNTRY_ID") private Long id; @Column(name = "COUNTRY_NAME") private String name; @Column(name = "COUNTRY_CODE") private String code; @JacksonXmlElementWrapper(localName = "languages") @JacksonXmlProperty(localName = "languages") @OneToMany(mappedBy = "country", fetch = FetchType.EAGER, cascade = CascadeType.ALL) List<Language> languages; // getters and setters }
和…
@Entity @Table(name = "LANGUAGE") public class Language { @Id @GeneratedValue @Column(name = "LANGUAGE_ID") private Long id; @Column(name = "LANGUAGE_NAME") private String name; @ManyToOne @JoinColumn(name = "COUNTRY_ID") @JsonIgnore private Country country; //getters and setters }
以下是我的Rest控制器:
@RestController @RequestMapping("/countries") public class CountryRestController { private final ICountryRepository iCountryRepository; @Autowired public CountryRestController(ICountryRepository iCountryRepository) { this.iCountryRepository = iCountryRepository; } @PostMapping("/country") public ResponseEntity<?> postCountryDetails(@RequestBody Country country) { Country savedCountry = this.iCountryRepository.save(country); URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}") .buildAndExpand(savedCountry.getId()).toUri(); return ResponseEntity.created(location).build(); } //other methods }
我正在尝试保存在JSON下面:
{ "name": "Ireland", "code": "IRE", "languages": [ { "name": "Irish" } ] }
问题在于语言(子级)外键始终为null,但是正在插入其他属性。我用过class @JsonIgnore属性Country country,是Language因为它引起了请求大小的问题,因为我还有另一个API可以获取Country及其语言的数据。
@JsonIgnore
Country country
请指导。
您可以通过以下方式进行操作:
Country newCountry = new Country(country.getName()); ArrayList < Language > langList = new ArrayList<>(); for (Language lang : country.getLanguages()) { langList.add( new Language(language.getName(), newCountry ) ) ; } newCountry.setLanguages( langList ); iCountryRepository.save(newCountry);
PS:不要忘记添加适当的构造函数。另外,如果要像这样进行构造函数重载,则必须添加默认构造函数:
public Country() {} public Country(String name) {this.name = name }