Ответы пользователя по тегу Spring
  • Как сохранить коллекцию объектов при помощи JPA?

    Waynes
    @Waynes Автор вопроса
    В общем рабочих решения по итогу 2. Если кто-нибудь сможет предложить что-нибудь более "достойное" буду очень признателен!

    Наш JSON от клиента:

    {"subCategories":[{"name":"Детские игрушки"},{"name":"Детское питание"},{"name":"Мамина-рация"}]}


    + Мы еще принимаем ID Высшей категории с помощью : @PathVariable(value = "highCategoryId")

    Десериализуем c помощью класса-Wrapper-a :

    public class SubCategoryWrapper {
    
        private List<SubCategory> subCategories;
    
        /**
         * @return the subCategories
         */
        public List<SubCategory> getSubCategories() {
            return subCategories;
        }
    
        /**
         * @param subCategories the persons to set
         */
        public void setSubCategories(List<SubCategory> subCategories) {
            this.subCategories = subCategories;
        }
    
    }


    Вот собственно сам SubCategory.java:
    @Entity
    @Table(name = "sub_category")
    public class SubCategory extends BaseModel {
    
    
        @Column(name = "NAME")
        private String name;
    
    
        @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
        @JoinColumn(name = "HIGH_CATEGORY_ID",referencedColumnName = "ID")
        private HighCategory highCategory;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public HighCategory getHighCategory() {
            return highCategory;
        }
    
        public void setHighCategory(HighCategory highCategory) {
            this.highCategory = highCategory;
        }
    
        @Override
        public String toString() {
            return "Имя Подкатегории: "+getName();
        }
    
    }


    В DAO слое (Туда приход highCategoryId и SubCategoryWrapper ) у нас есть 2 пути :
    1:
    HighCategory highCategory=entityManager.find(HighCategory.class,highCategoryId);
            highCategory.setSubCategories(subCategories.getSubCategories());

    В этом способе в SubCategoryWrapper, в каждом объекте коллекции List не проинициализирована переменная highCategory. Поэтому тут требуется сделать дополнительные манипуляции с сетером в HighCategory:
    public void setSubCategories(List<SubCategory> subCategories) {
            this.subCategories = subCategories;
            for(SubCategory subCategory: subCategories){
                subCategory.setHighCategory(this);
            }

    Может кто знает, как проинициализировать ее без таких плясок?

    2-ой способ:

    for (SubCategory subCategory : subCategories.getSubCategories()) {
                entityManager.createNativeQuery("INSERT INTO sub_category(NAME,HIGH_CATEGORY_ID) VALUES(?,?)")
                        .setParameter(1,subCategory.getName())
                        .setParameter(2,highCategoryId).executeUpdate();
    
            }
    Ответ написан
    Комментировать