Проблема сопоставления отношений Spring MyBatis - PullRequest
0 голосов
/ 16 июня 2019

Я использую MyBatis с базой данных h2 для учебных целей.У меня проблема, когда я хочу вставить дочерний объект в родительский объект в запросе, тогда я получил исключение.

Студенческий класс

public class Student {
  private Long id;
  private String name;
  private Index index;

  public Student(Long id, String name, Index index) {
    this.id = id;
    this.name = name;
    this.index = index;
  }
// getters and setters..
}

Индексный класс

public class Index {
  private Long id;
  private String number;

  public Index() { }

  public Index(Long id, String number) {
    this.id = id;
    this.number = number;
  }
// getters and setters..
}

Репозиторий студентов

@Mapper
@Repository
public interface StudentRepo {

  @Select("SELECT * FROM student WHERE id=#{id}")
  Student findById(long id);
                 // exception occurs for index field, which is my child object
  @Insert("INSERT INTO student VALUES(#{id}, #{name}, #{index})")
  int insert(Student student);
}

Индекс репозитория

@Mapper
@Repository
public interface IndexRepo {

  @Select("SELECT * FROM index WHERE id =#{id}")
  Index findById(long id);

  @Insert("INSERT INTO index VALUES(#{id}, #{number})")
  int insert(Index index);
}

Исключение

Caused by: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'index'. It was either not specified and/or could not be found for the javaType (com.example.batis.domain.Index) : jdbcType (null) combination.
``

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Ошибка возникает из-за того, что вы не указали mybatis, как преобразовать объект типа Index в значение, которое хранится в таблице student (идентификатор Index, я полагаю).

Вам необходимо указать, как получить значение, которое будет сохранено из объекта, который доступен следующим образом:

@Insert("INSERT INTO student VALUES(#{id}, #{name}, #{index.id})")
int insert(Student student);
0 голосов
/ 17 июня 2019

Как уже упоминалось, я должен был поставить поле рядом с индексом, поэтому рабочий код

@Mapper
@Repository
public interface StudentRepo {

  @Select("SELECT * FROM student WHERE id=#{id}")
  Student findById(long id);

  @Insert("INSERT INTO student VALUES(#{id}, #{name}, #{index.id})")
  int insert(Student student);
}

...