首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 4.3 SessionFactory 建立新寫法與 @Table 註解相容性問題解決

     編輯:Java 相關知識

Hibernate 4.3 新版 SessionFactory 建構

4.3 版引入 StandardServiceRegistry,舊版 buildSessionFactory() 已棄用:

public class HibernateUtil {
    private static SessionFactory factory;

    static {
        try {
            Configuration cfg = new Configuration().configure();
            StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties()).build();
            factory = cfg.buildSessionFactory(registry);
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }

    public static SessionFactory getSessionFactory() { return factory; }
    public static Session openSession() { return factory.openSession(); }
    public static Session getCurrentSession() { return factory.getCurrentSession(); }
    public static void closeSession(Session s) { if (s != null && s.isOpen()) s.close(); }
}

@Table 註解導致 NoSuchMethodError 問題

java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

錯誤發生於實體類別使用 @Table(name="t_user") 時。

原因分析

  • Hibernate 4.3 依賴 JPA 2.1 API,javax.persistence.Table 新增 indexes() 方法。
  • 專案若傳遞依賴引入舊版 hibernate-jpa-2.0-api 或 ejb3-persistence,類別載入時缺少新方法,拋出 NoSuchMethodError。

解決方案

  1. 統一 JPA API 版本:確保 pom.xml 僅包含 hibernate-jpa-2.1-api(或 javax.persistence:persistence-api:1.0.2 以上),排除舊版傳遞依賴。
  2. 替代寫法:若無法升級 API,改用 @Entity(name="t_user") 指定表名(但語意上較不清晰)。
  3. 排除衝突依賴:

    org.hibernate
    hibernate-entitymanager
    4.3.x.Final
    
        org.hibernate.javax.persistencehibernate-jpa-2.0-api
    


    org.hibernate.javax.persistence
    hibernate-jpa-2.1-api
    1.0.0.Final

最佳實踐

  • 使用 mvn dependency:tree 檢查 JPA API 版本衝突。
  • 優先解決依賴衝突,保留 @Table 標準用法,維持程式碼可讀性與 JPA 相容性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved