org.hibernate.TypeMismatchException: предоставлен идентификатор неправильного типа при получении данных - сопоставление @OneToOne со встроенными идентификаторами - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть 2 таблицы, которые имеют те же столбцы, что и первичный ключ.Несмотря на то, что таблицы имеют те же столбцы, что и первичный ключ, исходя из значимости информации, данные нормализуются по 2 таблицам.Я пытаюсь установить отношения один к одному между двумя таблицами через ORM.Ниже приведены структура таблиц и сущностей,

Таблица A: input_tables

SOURCE TABLE_NAME COL1 COL2 COL3 источник 1 tbl 1 xxx yyy zzz источник 2 tbl 3 ggg kkk kk источник 3 tbl 2xxx yyy zzz источник 4 tbl 5 ggg kkk kk

Таблица 1: input_tables

Таблица B: input_table_Structures

ИСТОЧНИК TABLE_NAME COL4 COL5 COL6 источник 1 tbl1 xxx yyy zzz source 2 tbl 3 ggg kkk kk source 3 tbl 2 xxx yyy zzz source 4 tbl 5 ggg kkk kk

Таблица 2: input_table_structures

InputTable.java

@Entity
@Table(name = "input_tables")
public class InputTable implements Serializable {

    @EmbeddedId
    private InputTablePK inputTableKey;

    @Column(name = "col1")
    private String col1;

    @Column(name = "col2")
    private String col2;

    @Column(name = "col3")
    private String col3;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumns({@JoinColumn (name = "source",  referencedColumnName="source",insertable=false,updatable=false),
            @JoinColumn(name = "table_name", referencedColumnName="table_name",insertable=false,updatable=false)})*
    private InputTableStructure inputTableStructure;


}

InputTablePK.java

@Embeddable
public class InputTablePK implements Serializable{

    @Column(name = "source")
    private String source;

    @Column(name = "table_name")
    private String tableName;

   ....


}

InputTableStructure.java

@Entity
@Table(name="input_table_structures")
public class InputTableStructure {

    @EmbeddedId
    private InputTableStruturePK inputTablesStructurKey;


    @Column(name = "col4")
    private String coalesedColumnOracle;

        @Column(name = "col5")
    private String coalesedColumnOracle;

        @Column(name = "col6")
    private String coalesedColumnOracle;


    @OneToOne(mappedBy = "inputTableStructure",fetch = FetchType.EAGER)
    private InputTable inputTable;

   ....
}

InputTableStructurePK.java

@Embeddable
public class InputTableStruturePK implements Serializable{

    @Column(name = "source")
    private String source;

    @Column(name = "table_name")
    private String tableName;

   ....


}

, и у меня есть хранилище,

@Repository
public interface InputTableRepository extends CrudRepository<InputTable,InputTablePK>{

    List<InputTable> findAll();

}

Всякий раз, когда я пытаюсь извлечь данные для InputTable, я получаю следующее исключение:

org.hibernate.TypeMismatchException: предоставляется идентификатор неправильного типа для класса InputTableStructure.Ожидается: класс InputTableStructurePK, получен класс InputTablePK

Поскольку оба класса имеют одинаковые столбцы в качестве первичного ключа, я попытался использовать один и тот же класс Embeddable как EmbeddedId в объектах InputTable и InputTableStructure, т.е. я пытался использоватьКласс InputTablePK как EmbeddedId в объектах InputTable и InputTableStructure, при котором я получаю следующую ошибку:

org.postgresql.util.PSQLException: ОШИБКА: столбец inputtable0_.col4 не существует

То, чего я пытаюсь добиться, - это установить взаимно-однозначное отношение между обоими сущностями и выполнить запрос по InputTable, чтобы извлечь данные из таблицы input_table в качестве основного объекта и данные таблицы input_table_structure как вложенный объект .

Пожалуйста, исправьте меня, если есть какие-либо исправления, необходимые в подходе.

1 Ответ

0 голосов
/ 24 февраля 2019

Но у сущностей нет одинаковых @EmbededId, вы не можете поменять их местами.Если они одинаковые, используйте InputTablePK в обеих сущностях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...