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(); }
}
java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
錯誤發生於實體類別使用 @Table(name="t_user") 時。
javax.persistence.Table 新增 indexes() 方法。hibernate-jpa-2.0-api 或 ejb3-persistence,類別載入時缺少新方法,拋出 NoSuchMethodError。pom.xml 僅包含 hibernate-jpa-2.1-api(或 javax.persistence:persistence-api:1.0.2 以上),排除舊版傳遞依賴。@Entity(name="t_user") 指定表名(但語意上較不清晰)。org.hibernate hibernate-entitymanager 4.3.x.Final org.hibernate.javax.persistence hibernate-jpa-2.0-api org.hibernate.javax.persistence hibernate-jpa-2.1-api 1.0.0.Final
mvn dependency:tree 檢查 JPA API 版本衝突。@Table 標準用法,維持程式碼可讀性與 JPA 相容性。