JPA не сохраняет связанный объект в объекте, полученном аннотацией @RequestBody - PullRequest
1 голос
/ 14 мая 2019

следующий Developer Entity.

  • 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);
    }

}

просмотр запроса к RestController (/ about / developers / rest / add) через ajax. и далее - 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"}
    ]

RestController, включающий @RequestBody

  • 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 объекты.

фактически, оба случая сохраняют связанные 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);
        }

1 Ответ

1 голос
/ 14 мая 2019

сначала не будет работать, потому что в списке статей в json нет привязанного объекта разработчика.второй случай работает из-за этой строки

    newDeveloper.addArticle(newArticle);

, в которую вы добавляете if (article.getDeveloper ()! = this) article.setDeveloper (this);попробуйте привязать объект разработчика в вашем списке статей в первом цикле, и ваш код будет работать.я имею в виду попытаться связать объект разработчика в каждом объекте статьи из списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...