MyBatis插入一对多关系

4
我有一个非常简单的问题和选项之间的一对多关系,选项具有指向问题的外键(questionId),现在我要在一个XML配置中插入一个包含选项列表的问题对象。
问题:
public Class Question{
    ...
    private Integer questionId;
    private List<Option> options;
    ....
}

选项:
public Class Option{
   ...
   private Integer optionId;
   private String context;

   private Integer questionId; //FK

   ....
}

配置:
...

<insert id="insertQuestion" parameterType="com.pojos.Question" useGeneratedKeys="true">

        INSERT into question (...) VALUES (...);

        <selectKey keyColumn="questionId" keyProperty="questionId" resultType="int">
            SELECT MAX(questionId) FROM question;
        </selectKey>

        INSERT INTO option (context, questionId)
        VALUES
            <foreach collection="options" item="option" open="(" separator="),(" close=")">
                #{option.context}, #{questionId}
            </foreach>
    </insert>

...

如您所见,我想使用刚刚自动生成的questionId作为选项的FK信息,但是它无法正常工作,我该如何让它工作?或者我不能将它们放入单个范围内吗?
1个回答

5
在Java 8中,您可以使用默认接口方法。首先,您需要像这样将操作分离出来:
  • Main table:

    INSERT into question (...) VALUES (...);
    
    <selectKey keyColumn="questionId" keyProperty="questionId" resultType="int">
        SELECT MAX(questionId) FROM question;
    </selectKey>
    

  • One to many relationship

    INSERT INTO option (context, questionId)
    VALUES
        <foreach collection="options" item="option" open="(" separator="),(" close=")">
            #{option.context}, #{questionId}
        </foreach>
    

在您的接口中,至少需要三种方法:insertQuestioninsertQuestionOptions和默认方法(例如可以称之为insertQuestionWithOptions),该方法使用两种方法将其插入。

public interface QuestionDao {

    int insertQuestion(Question question);

    int insertOptions(List<Option> options);

    default int insertQuestionsWithOptions(Question question) {
        insertQuestion(question);
        insertOptions(question.getOptions());
   }
}

所以,现在你可以使用方法insertQuestionsWithOptions(Question question),它将插入问题和选项之间的一对多关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接