簡體   English   中英

通過 Hibernate Session.get() 方法獲取表數據時出現 TypeMismatchException

[英]TypeMismatchException on fetching the table data by Hibernate Session.get() method

在應用程序中,將數據庫表CUSTOMERS定義為:

create table CUSTOMERS (
  ID varchar(10),
  CODE varchar(10),
  CID varchar(10),
  SID varchar(10),
  FNAME varchar(50),
  LNAME varchar(50),
  constraint PK_CUSTOMERS primary key (ID, CODE, CID, SID)
);

並創建實體類以將數據填充為

@Embeddable
public class CustKey implements Serializable , Cloneable{

    @Transient
    private static final long serialVersionUID = 1L;

    @Column(name = "ID", nullable = false)
    private String id;
    
    @Column(name = "CODE", nullable = false)
    private String code;
    
    @Column(name = "CID", nullable = false)
    private String cid;

    @Column(name = "SID", nullable = false)
    private String sid;
    
    public boolean equals(Object o){
     return id.equals(o.getId()) && ...;
   }

    public int hashcode(){
     return id.hashcode() & ...;
   }
}


@Entity
@Table(name = "CUSTOMERS")
public class CustProfileWrapper implements Serializable,Cloneable  {

    @Transient
    private static final long serialVersionUID = 1L;
    
    @EmbeddedId
    private CustKey custKey;
    
    @Column(name = "FNAME")
    private String fname;
    
    @Column(name = "LNAME")
    private String lname;
}

記錄的填充沒有問題。

但是由於代碼/項目的一些重寫,實體類被移動到其他項目(但保持與以前相同的 package 名稱)。 但是在通過 Hibernate Session 獲取數據時

Object object = session.get(CustProfileWrapper.class, custProfileWrapper.getCustKey(), LockMode.NONE);

得到錯誤

org.hibernate.TypeMismatchException: Provided id of the wrong type for class CustProfileWrapper. Expected: class com.db.CustProfileWrapper, got class com.db.CustProfileWrapper 

但是,當使用參數化查詢作為

SQLQuery query = session.createSQLQuery("SELECT * FROM CUSTOMERS WHERE ID = ? "
        + " AND CODE = ? AND CID = ? AND SID = ? ");
query.addEntity(CustProfileWrapper.class);
query.setParameter(0, "101");
...
object = query.list();
        

但是在使用查詢時它是一個低級代碼,我們應該使用更好的方法,比如 get() 方法。

任何幫助/提示將不勝感激!


錯誤的完整堆棧跟蹤: 堆棧跟蹤1 堆棧跟蹤2 堆棧跟蹤3 堆棧跟蹤4

經過這么多調查,找到了罪魁禍首spring-boot-devtools依賴項,如下所述:

在我的 Springboot 項目中添加對 spring-boot-devtools 的依賴項后,我遇到了這個問題。 我刪除了依賴項,問題就消失了。 在這一點上我最好的猜測是 spring-boot-devtools 引入了一個新的類加載器,並且在某些線程沒有使用新類加載器的某些情況下,這會導致不同類加載器之間的 class 轉換問題。

參考: A dozer map 異常與 Spring boot devtools 相關

Refs: ClassCastException 轉換為相同的 class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM