使用Hibernate 5.4.12时遭遇java.lang.ClassCastException错误求助
问题排查与解决方案
我帮你梳理了这个ClassCastException的根源,主要是XML配置文件语法错误引发的解析异常,再加上代码初始化顺序和数据库连接参数的小问题,具体修复步骤如下:
1. 修复Hibernate配置文件的语法错误
你的hibernate.cfg.xml里有一行明显的语法错误,直接导致了XML解析器的异常:
原错误代码:
<property name="hbm2ddl.auto",environment="hibernate.dialect")>update</property>
这行里多余的逗号和括号完全不符合XML标签的语法规范,把它改成正常的属性标签:
<property name="hbm2ddl.auto">update</property>
另外,你的数据库连接URL里useSSL参数没有指定值,这会导致JDBC连接警告甚至失败,补充上值(本地开发推荐设为false):
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/fortune?verifyServerCertificate=false&useSSL=false</property>
2. 调整Hibernate初始化代码的顺序
原代码中先构建ServiceRegistry再加载配置文件,这会导致配置文件里的属性根本没被读取到Configuration对象中,正确的顺序应该是先加载配置,再构建注册表:
修正后的App类代码:
public class App { public static void main( String[] args ) { Model model=new Model(); model.setId(102); model.setName("Alien"); model.setColor("Green"); Configuration con = new Configuration(); // 先加载配置文件和实体类 con.configure().addAnnotatedClass(Model.class); // 基于加载好的配置构建ServiceRegistry ServiceRegistry sg = new StandardServiceRegistryBuilder() .applySettings(con.getProperties()) .build(); SessionFactory sf = con.buildSessionFactory(sg); Session ss = sf.openSession(); Transaction tns = ss.beginTransaction(); ss.save(model); tns.commit(); ss.close(); sf.close(); } }
3. 可选:适配MySQL版本的配置优化
如果你的MySQL版本是8.0及以上,记得更新驱动类和方言,避免兼容性问题:
- 驱动类从
com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver - 方言从
org.hibernate.dialect.MySQLDialect改为org.hibernate.dialect.MySQL8Dialect
错误原因说明
当XML配置文件存在语法错误时,Hibernate依赖的JAXB解析器在处理畸形的XML结构时,会生成不符合预期的StAX事件,进而触发EntityReferenceEvent转Characters的类型转换异常。只要修复好XML的语法问题,这个异常就会自动消失。
内容的提问来源于stack exchange,提问作者Thar Lin Htet
相关产品推荐
相关产品推荐

