org.hibernate.TypeMismatchException:提取数据时提供错误类型的ID-具有嵌入式ID的@OneToOne映射

时间:2019-02-23 20:08:34

标签: java spring hibernate jpa


我有2个表,它们具有与主键相同的列。尽管这些表与主键具有相同的列,但根据信息的重要性,数据将在2个表中进行标准化。我正在尝试通过ORM在2个表之间建立一对一的关系。下面是表和实体的结构,

表A:input_tables

SOURCE TABLE_NAME COL1 COL2 COL3 源1 tbl 1 xxx yyy zzz 源2 tbl 3 ggg kkk kk 源3 tbl 2 xxx yyy zzz 来源4 tbl 5 ggg kkk kk

Table 1: input_tables

表B:input_table_Structures

SOURCE TABLE_NAME COL4 COL5 COL6 源1 tbl 1 xxx yyy zzz 源2 tbl 3 ggg kkk kk 源3 tbl 2 xxx yyy zzz 来源4 tbl 5 ggg kkk kk

Table 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类提供了错误类型的ID。预期:InputTableStructurePK类,获得InputTablePK类

由于两个类都具有与主键相同的列,因此我尝试在InputTable和InputTableStructure实体中使用与EmbeddedId相同的Embeddable类,即我尝试在InputTable和InputTableStructure实体中使用InputTablePK类作为EmbeddedId。收到以下错误,

org.postgresql.util.PSQLException:错误:列inputtable0_.col4不存在

我想要实现的是在两个实体之间建立一对一的关系,并通过InputTable查询,以获取表input_table的数据作为主要对象,以及表< strong> input_table_structure作为嵌套对象。

如果该方法需要任何更正,请纠正我。

1 个答案:

答案 0 :(得分:0)

但是实体没有相同的@EmbededId,因此您无法交换它们。如果它们相同,则在两个实体中使用InputTablePK