Обновление с помощью CrudRepository save () изменяет порядок нескольких файлов и изменяя их ID - PullRequest
0 голосов
/ 01 марта 2019

Привет, ребята, у меня проблема, когда я пытаюсь обновить вопросник от json.Мне нужно хранить некоторые данные в БД из JSON.Я использую несколько объектов для установки вопросника и некоторые @onetomany для создания чужого ключа.

При первом сохранении данных все хорошо, в спящем режиме правильно хранятся все данные с автоматически сгенерированным идентификатором, когда я пытаюсь загрузить сноваjson, с некоторыми изменениями в дочерней таблице, идентификатор вопросника сохраняется правильно (потому что это поле, полученное непосредственно от json), вопросы и ответы меняются, хотя я задаю значения.

Надеюсь, вы не понимаете, о чем я.

это моя сущность:

public class Questionary implements Serializable {

    private static final long serialVersionUID = -6101283729971360969L;
    /**
     * Primary key from JSON
     */
    @Id 
    @JsonIgnore
    private int id;
    @Version
    private Long version;
    private String desc;


    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name = "idQuest")
    @OnDelete(action = OnDeleteAction.CASCADE)
    @OrderBy("identityQuestion ASC")
    private Set<Question> question;

public class Question implements Serializable {

private static final long serialVersionUID = -6101283729971360969L;
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@Version
private Long version;
private int identityQuestion;
private String text;
private long idTipoTag;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "idQuestion")
@OnDelete(action = OnDeleteAction.CASCADE)
@OrderBy("identityAnswer ASC")
private Set<Answer> answer;

это метод на контроллере

@RestController
@Slf4j
public class QuestionaryController {

@Autowired
private QuestionaryRepository questionaryRepository;
@Autowired
private AnswerRepository answerRepository;

@RequestMapping(value = "/save", method = RequestMethod.POST)
public void saveQuest(@RequestBody List<QuestionaryDTO> questDTO) {

    for (QuestionaryDTO questionaryDTO : questDTO) {

        /**
         * find value in db
         */
            Questionary quest = questionarioRepository.findById(questionarioDTO.getId());
            if (quest != null) {

                quest.setDescrizione(questionarioDTO.getDescrizione());

                Set<QuestionDTO> listQuestion = QuestionaryDTO.getQuestion();
                Set<Question> questionDB = quest.getQuestion();

                ArrayList<QuestionDTO> l = new ArrayList<QuestionDTO>(listQuestion);
                ArrayList<Question> c = new ArrayList<Question>(questionDB);

                int i = -1;
                for(int j=0; j<l.size();j++) {

                    i++;
                    Question dom = c.get(i);                
                    dom.setIdentityQuestion(l.get(j).getId());
                    dom.setIdTipoTag(l.get(j).getIdTipoTag());
                    dom.setText(l.get(j).getText());
                    questionDB.add(dom);

                        ecc...

                }
                quest.setquestion(questionDB);
                questionariyRepository.save(quest);

            } else {


            /**
             * Questionary
             */
            Questionary questn = new Questionary();
            questn.setTitle(questionaryDTO.getTitle()); 
            questn.setId(questionaryDTO.getId());
            /**
             * Questions
             */
            Set<QuestionDTO> listQuestion = questionaryDTO.getQuestion();
            Set<Question> QuestionDB = new HashSet<>();
            for (QuestionDTO questionDTO : listQuest) {
                Question que = new Question();
                que.setIdentityQuestion(questionDTO.getId());
                que.setText(QuestionDTO.getText());
                que.setIdTipoTag(QuestionDTO.getIdTipoTag());
                QuestionDB.add(que);
                /**
                 * Answers
                 */
                Set<AnswerDTO> listAnswers = AnswerDTO.getAnswers();
                Set<Answers> listAnswersDB = new HashSet<>();

                for (AnswersDTO AnswersDTO : listAnswer) {
                    Answers ans = new Answers();
                    ans.setIdentityAnswer(AnswerDTO.getId());
                    asn.setText(AnswerDTO.getText());
                    listAnswersDB.add(ans);
                }
                dom.setAnswer(listAnswersDB);
            }
            questn.setQuestion(QuestionDB);
            questionarioRepository.save(questn);
            }
        }
    }

Это сущность DTO

public class QuestionariyDTO implements Serializable{

    private static final long serialVersionUID = -1886966747159529916L;
    private int id;
    private int identityQuestionary;
    private String title;
    private Set<QuestionDTO> questions;

}

public class QuestionDTO implements Serializable {

    private static final long serialVersionUID = -1886966747159529916L;
    private int id;
    private String text;
    private Long idTipoTag;
    private Set<AnswerDTO> answers;
}

public class AnswerDTO implements Serializable{

    private static final long serialVersionUID = -1886966747159529916L;
    private Long id;
    private String text;
    private Long identityAnswer;
}

это на примере структуры json

    [
    {
        "id": 1,
        "title": "TITLE",
        "questions": [
            {
                "id": 1, <--- this id is only "identityQuestion" on db is not the primary key
                "text": "some text",
                "idTipoTag": 1,
                "answers": [
                    {
                        "id": 1, <--- this id is only "identityAnswer" on db is not the primary key
                        "text": "answ 1"
                    },
                    {
                        "id": 2,
                        "text": "answ 2"
                    },
                    {
                        "id": 3,
                        "text": "answ 3"
                    },
                    {
                        "id": 4,
                        "text": "answ 4"   
                    }
                    ]
            },
            {
                "id": 2,
                "text": "some text",
                "idTipoTag": 1,
                "answers": [
                    ...

                    .

                    .
                    .
                    .
                    .
                    ]
            },
...
        ]
    }
]

Извините за длинный пост.

РЕДАКТИРОВАТЬ - РЕШЕНИЕ:

ПричинаСохранить в случайном порядке - это HashSet, у них нет порядка и всегда сохранять дату в случайном порядке.

Я только что преобразовал все значение Set в список.После того, как сделаю это, когда я перейду к экземпляру объекта, я использую LinkedList для значения заказа!

эта работа сглаживает для меня!

вот пример:

До:

Set<QuestionDTO> listQuestion = questionaryDTO.getQuestion();
Set<Question> QuestionDB = new HashSet<>();

После:

List<QuestionDTO> listQuestion = questionaryDTO.getQuestion();
List<Question> QuestionDB = new LinkedList<>();

Надеюсь, это кому-нибудь пригодится:)

1 Ответ

0 голосов
/ 04 марта 2019

Причиной сохранения в случайном порядке является HashSet, у них нет порядка и всегда сохраняется дата в произвольной позиции.

Я только что преобразовал все значение Set в список.После того, как я сделаю это, когда я перейду к экземпляру объекта, я использую LinkedList для значения заказа!

для меня эта работа сглаживается!

вот пример:

До:

Set<QuestionDTO> listQuestion = questionaryDTO.getQuestion();
Set<Question> QuestionDB = new HashSet<>();

После:

List<QuestionDTO> listQuestion = questionaryDTO.getQuestion();
List<Question> QuestionDB = new LinkedList<>();

Надеюсь, это кому-нибудь пригодится:)

...