2015-10-09 5 views
3

У меня очень простой (Question) для многих отношений (Options), у опции есть FK (questionId). Вопрос: теперь я собираюсь вставить объект Question со списком параметров внутри одной конфигурации XML.MyBatis вставляет отношения для многих

Вопрос:

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

В 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) который будет вставлять вопросы и варианты один ко многим.

Смежные вопросы