【发布时间】:2019-05-14 05:13:01
【问题描述】:
以下是Developer 实体。
Developer
@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实体。
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);
}
}
通过 ajax 查看对 RestController (/about/developers/rest/add) 的请求。 以下是Request Body的json。
- 请求正文 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"}
]
包含@RequestBody的RestController
RestController
@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 对象。
事实上,这两种情况都是在 RestController 的方法中保存关联的Articles。
但是在web控制器的方法中,当我使用developerService.findAll()时,没有文章。因此,如果我通过Model 传递检索到的Developer 对象,则没有关联的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> {
}
以下是ARTICLEh2-console中的表
ARTICLE Table in h2-console (click me for image)
如您所见,DEVELOPER_ID 为空。
我可以只用解决这个问题吗
for (Developer developer : developerList) {
developerService.save(developer);
}
?
【问题讨论】:
标签: java spring-data-jpa thymeleaf