следующий Developer
Entity.
@Entity
@Getter
@Setter
public class Developer {
@Id
@GeneratedValue
@Column(name="DEVELOPER_ID")
private Long id;
private String nickname;
private String name;
private String imageURI;
@OneToMany(mappedBy = "developer", cascade={CascadeType.PERSIST})
private List<Article> articleList = new ArrayList<>();
public void addArticle(Article article) {
this.articleList.add(article);
if ( article.getDeveloper() != this )
article.setDeveloper(this);
}
}
и далее Article
Сущность.
@Entity
@Getter
@Setter
public class Article {
@Id
@GeneratedValue
@Column(name="ARTICLE_ID")
private Long id;
private String subject;
@ElementCollection
private List<String> contents = new ArrayList<>();
public void addContent(String content) {
this.contents.add(content);
}
@ManyToOne
@JoinColumn(name="DEVELOPER_ID")
private Developer developer;
public void setDeveloper(Developer developer) {
this.developer = developer;
if ( !developer.getArticleList().contains(this) )
developer.getArticleList().add(this);
}
}
просмотр запроса к RestController (/ about / developers / rest / add) через ajax.
и далее - json тела запроса.
[
{"articleList":[
{"contents":["article line","article line"],
"subject":"article subject"},
{"contents":["article line","article line","article line"],
"subject":"article subject"}
],
"nickname":"dev nickname",
"name":"(dev name)",
"imageURI":"default.png"
},
{"articleList":[
{"contents":["article line","article line"],
"subject":"article subject"},
{"contents":["article line"],
"subject":"article subject"}
],
"nickname":"dev nickname",
"name":"(dev name)",
"imageURI":"default.png"}
]
RestController, включающий @RequestBody
@RestController
@RequestMapping("/about")
public class AboutRestController {
@Autowired
private DeveloperService developerService;
@PostMapping("/developers/rest/add")
public void developersRegisterAPI(@RequestBody List<Developer> developerList) {
/** Not Working **/
// Saving Developer only (except Associated Articles)
for (Developer developer : developerList) {
developerService.save(developer);
}
/** Working **/
// Saving Developers and Associated Articles
for (Developer developer : developerList) {
Developer newDeveloper = new Developer();
newDeveloper.setName(developer.getName());
newDeveloper.setImageURI(developer.getImageURI());
newDeveloper.setNickname(developer.getNickname());
for (Article article : developer.getArticleList()) {
Article newArticle = new Article();
newArticle.setSubject(article.getSubject());
newArticle.setContents(article.getContents());
newDeveloper.addArticle(newArticle);
}
developerService.save(newDeveloper);
}
}
}
когда я печатал @RequestBody List<Developer> developerList
, каждый Developer
объект связывал Article
объектов.
в первом случае (не работает должным образом, developerService.save(developer);
), результат developerService.findAll()
включает только Developer
Объекты. в извлеченных Developer
объектах нет Article
объектов.
во втором случае (работает правильно, developerService.save(newDeveloper);
), результат developerService.findAll()
, включая Developer
Объекты и связанные Article
объекты.
фактически, оба случая сохраняют связанные Article
s в методе RestController.
но в методе веб-контроллера, когда я использовал developerService.findAll()
, нет статей. поэтому, если я передал извлеченные Developer
объекты через Model
, нет связанных Article
, и представление не может распечатать эти объекты.
и следующий DeveloperService
DeveloperService
и DeveloperRepository
@Service
public class DeveloperService {
@Autowired
DeveloperRepository developerRepository;
public void save(Developer developer) {
developerRepository.save(developer);
}
public void delete(Developer developer) {
developerRepository.delete(developer);
}
public List<Developer> findAll() {
return developerRepository.findAll();
}
}
@Repository
@Transactional
public interface DeveloperRepository extends JpaRepository<Developer, Long> {
}
и следующие ARTICLE
Таблица в h2-console
АРТИКУЛ Стол в h2-консоли (щелкните меня для изображения)
как видите, DEVELOPER_ID
равно нулю.
можно ли это исправить только с помощью
for (Developer developer : developerList) {
developerService.save(developer);
}