Spring 應用啟動時拋出 BeanCreationException,根因 Hibernate MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister。這通常由實體類映射錯誤、構造函數不匹配、或 Hibernate 版本與 Spring 版本不兼容引起。
Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123)
...
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:486)
Hibernate 要求實體類有 public/protected 無參構造函數。若定義了有參構造函數且未顯式提供無參構造函數,會導致實例化失敗。
@Entity
public class User {
public User(String name) { this.name = name; } // 只有有參構造函數
// 需添加:
protected User() {} // Hibernate 使用
}
非靜態內部類隱含外部類引用,Hibernate 無法實例化。解決:改為 static class 或移至頂層類。
使用了 Hibernate 不支持的類型(如某些第三方庫類型),需實現 UserType 或轉換為基本類型。
堆棧顯示 hibernate-core-5.2.2.Final 和 spring-orm-4.3.2.RELEASE。Spring 4.3.x 建議搭配 Hibernate 5.0.x 或 5.1.x,5.2.x 可能有 API 變更導致不兼容。嘗試降級 Hibernate 或升級 Spring。
實體類必須有且僅有一個 @Id,且類型支持主鍵生成策略。
hibernate.show_sql=true、hibernate.format_sql=true。javap)確認構造函數。@Id 和一個字段)驗證啟動是否正常,再逐步添加字段定位問題字段。「Could not get constructor for SingleTableEntityPersister」多數源於實體類構造函數、內部類、版本不兼容或映射錯誤。優先檢查無參構造函數和版本匹配。