使用CrudRepository更新save()会更改多个文件的顺序并更改它们的ID

问题描述 投票:0回答:1

嗨,伙计们,当我尝试从json更新一个问题时,我有一个问题。我需要从json中存储db中的一些数据。我使用多个实体来设置问题,并使用一些@onetomany来创建外键。

我第一次存储数据都很好,hibernate正确存储所有数据whit自动生成的id,当我尝试再次加载json whit子表上的一些更改时,Questionary的id仍然正确(因为是一个字段)来自json的dircetly)虽然我设定了值,但问题和答案会改变id。

我希望你明白我的意思。

这是我的实体:

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值转换为List。在我去实例对象后,我使用LinkedList作为订单值!

这项工作对我来说很顺利!

这是一个例子:

之前:

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

后:

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

希望它对某人有用:)

java spring-boot spring-data-jpa foreign-keys one-to-many
1个回答
0
投票

以随机顺序保存的原因是HashSet,它们没有订单并始终将日期保存在随机位置。

我刚刚将所有Set值转换为List。在我去实例对象后,我使用LinkedList作为订单值!

这项工作对我来说很顺利!

这是一个例子:

之前:

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

后:

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

希望它对某人有用:)

© www.soinside.com 2019 - 2024. All rights reserved.