generator 策略不一致導致 NameNotFoundExceptionTomcat + Struts + Hibernate + SQL Server 專案,啟動報錯:
javax.naming.NameNotFoundException: Name hibernate_connection_factory is not bound in this Context
無法連接數據庫。
多個 .hbm.xml 映射文件中 <id> 的 generator 策略不一致:
<!-- 文件 A -->
<generator class="identity"/>
<!-- 文件 B -->
<generator class="native"/>
identity 依賴數據庫自增列(SQL Server 支持),native 則由 Hibernate 根據方言自動選擇(可能選 sequence 或 hilo)。混用導致 SessionFactory 構建時對連接工廠的需求衝突,最終拋出 JNDI 綁定異常。
generator 策略,推薦用 native(跨數據庫遷移友好)或明確指定 identity(僅限支持自增的 DB)。hibernate.cfg.xml 中 dialect 是否正確:org.hibernate.dialect.SQLServerDialect。context.xml / web.xml)與 Hibernate 配置一致。query.iterate() 返回 Object[] 導致 ClassCastException[WARN] TypeDAO - java.lang.ClassCastException: com.shjinbang.hibernate.Type
Iterator itr = query.iterate();
while (itr.hasNext()) {
Object object[] = (Object[]) itr.next(); // 拋出異常
User user = (User) object[0];
...
}
HQL 查詢 from User 單表無關聯時,iterate() 直接返回實體對象(User),而非 Object[]。強轉為數組導致 ClassCastException。
Iterator itr = query.iterate();
while (itr.hasNext()) {
Object obj = itr.next(); // 直接接收 Object
User user = (User) obj; // 安全轉型
userForm.setUserId(user.getUserId());
...
}
Object[]?select u, r from User u join u.roles rselect u.id, u.name from User u這些場景下每行結果包含多個字段/實體,Hibernate 以 Object[] 封裝。
| 場景 | 推薦做法 |
|---|---|
| 主鍵生成策略 | 全項目統一 native 或按 DB 統一 identity/sequence |
| 單表查詢 | list() 返回 List<Entity>;iterate() 直接轉實體 |
| 多表/投影查詢 | 接收 List<Object[]>,按下標取值 |
| 性能優化 | 僅遍歷用 iterate()(延遲加載),需全加載用 list() |