我有一个非常简单的(Question)
到很多(Options)
关系,Option有FK (questionId)
来问,现在我要插入一个带有列表的Question对象一个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信息,但是它没有通过,我怎样才能使它工作?或者我不能把它们放在一个范围内?
答案 0 :(得分:2)
在java 8中,您可以使用default
接口方法。
首先,您需要将操作与以下内容分开:
主表:
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>
然后在您的界面中,您将至少有三种方法:insertQuestion
,insertQuestionOptions
和默认方法(例如,您可以将其称为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)
,它会在一对多的关系中插入问题和选项。