JPA @MappedSuperclass Для объекта не указан идентификатор

Я использую Spring-Boot 1.5.10 с spring-boot-starter-data-jpa. У меня есть промежуточная таблица и производственная таблица, обе имеют одинаковую структуру, только разные имена таблиц. Столбцы:

  • compKey1
  • compKey2
  • compKey3
  • col_A
  • col_B
  • col_c

Я получаю следующую ошибку:

Вызвано: org.hibernate.AnnotationException: идентификатор не указан для объекта: com.foo.bar.StagingTbl

У меня есть составной первичный ключ, класс определяется как:

@Embeddable
public class MyId implements Serializable {

        private static final long serialVersionUID = -99999999L;

        protected String compKey1;
        protected String compKey2;
        protected String compKey3;

       // setters/getters
}

my Abstract class:

        @MappedSuperclass
        public abstract class MyAbstractClass implements Serializable {

            protected static final long serialVersionUID = 7749572933971565230L;
            protected MyId myId;
            protected int col_A;
            protected Date col_B;
            protected String col_C

            public MyAbstractClass (String compKey1, String compKey2, String compKey3) {
              super();
              this.myId = new MyId(compKey1, compKey2, compKey3);
           }

            @EmbeddedId
            public MyId myId() {
                return myId;
            }
            public void setMyId(MyId myId) {
                this.myId= myId;
            }
          // getters/setters for other properties
}

мой конкретный класс:

@Entity
@Table(name = "STG_TABLE" , schema="MYSCEMA")
public class StagingTbl extends MyAbstractClass implements Serializable {

}

Идентификатор должен исходить от MyAbstractClass, который я расширяю. Я явно упускаю что-то глупое. Заранее спасибо.


person Micho Rizo    schedule 06.03.2018    source источник


Ответы (1)


Ваша ошибка тривиальна: Hibernate находит @EmbeddedId только в методе, если его имя соответствует соглашению Java Beans.

Просто измените геттер на:

@EmbeddedId
public MyId getMyId() {
    return myId;
}
person Lesiak    schedule 06.03.2018
comment
омг... это сводило меня с ума. спасибо, что поймали это ... Я позволил ide автоматически генерировать геттеры / сеттеры, и я этого не заметил - person Micho Rizo; 06.03.2018