外键在一对多关系中始终为空-使用JPA的Spring Boot Data

我有两个实体类,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及其语言的数据。

请指导。

回答:

您可以通过以下方式进行操作:

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 }

以上是 外键在一对多关系中始终为空-使用JPA的Spring Boot Data 的全部内容, 来源链接: utcz.com/qa/429149.html

回到顶部