Hibernate无法解析根实体PlayerStats:测试正常编译运行报错
加载PlayerStats实体时抛出UnknownEntityException:测试正常编译后报错
我通过特定UUID加载PlayerStats实体时,遇到UnknownEntityException异常,提示**"Could not resolve root entity 'PlayerStats'"**。测试代码可以正常运行,但编译后执行就会触发该错误。
相关代码
PlayerStats实体类
import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.persistence.Transient; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.io.Serializable; @Getter @Setter @NoArgsConstructor @Table @Entity public class PlayerStats implements Serializable { public PlayerStats(String UUID, int deaths, int placed, int destroyed, String settings) { this.UUID = UUID; setDeaths(deaths); setPlaced(placedBlocks); // 注:此处参数名与字段名不一致,疑似笔误 setDestroyed(destroyed); setSettings(settings); stringToBool(); } @Id @Column private String UUID; @Column private int deaths; @Column private int placed; @Column private int destroyed; @Column private String settings; // 省略其他方法 }
可正常运行的测试代码
@Test public void abc(){ SessionFactory sessionFactory; Properties properties = new Properties(); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); properties.setProperty("connection.driver_class", "com.mysql.cl.jdbc.Driver"); properties.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/alldatanew"); properties.setProperty("hibernate.connection.username", "root"); properties.setProperty("hibernate.connection.password", ""); properties.setProperty("hibernate.hbm2ddl.auto", "update"); properties.setProperty("current_session_context_class", "thread"); try { sessionFactory = new Configuration() .addProperties(properties) .addAnnotatedClass(PlayerStats.class) .buildSessionFactory(); } catch (final Exception e) { e.printStackTrace(); throw new RuntimeException(); } Session session = sessionFactory.openSession(); SelectionQuery<PlayerStats> query = session.createSelectionQuery("FROM PlayerStats as P WHERE P.UUID = :uuid", PlayerStats.class); query.setParameter("uuid", "test3"); PlayerStats playerStats = query.getSingleResult(); System.out.println(playerStats.getUUID()); }
生产环境中无法运行的PlayerStatsStore代码
public PlayerStats findByUUID(String uuid) { try (Session session = openSession()) { SelectionQuery<PlayerStats> query = session.createSelectionQuery("FROM PlayerStats as P WHERE P.UUID = :uuid", PlayerStats.class); query.setParameter("uuid", uuid); PlayerStats playerStats = query.getSingleResult(); return playerStats; } catch (final NoResultException exc) { return null; } }
SessionFactory创建代码(问题根源)
public SessionFactory createSessionFactory(Class<?>... clazz) { Properties properties = new Properties(); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); properties.setProperty("connection.driver_class", "com.mysql.cl.jdbc.Driver"); properties.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/alldatanew"); properties.setProperty("hibernate.connection.username", "root"); properties.setProperty("hibernate.connection.password", ""); properties.setProperty("hibernate.hbm2ddl.auto", "update"); properties.setProperty("current_session_context_class", "thread"); properties.setProperty("hibernate.show_sql", "true"); try { Configuration configuration = new Configuration(); configuration.addProperties(properties); for (Class<?> c : clazz) { configuration.addAnnotatedClass(c.getClass()); // 错误行 } return configuration.buildSessionFactory(); } catch (final Exception e) { e.printStackTrace(); throw new RuntimeException(); } }
异常信息
UnknownEntityException: Could not resolve root entity 'PlayerStats'
排查尝试
尝试使用@NamedQuery注解解决问题,但无效果,推测错误出在SessionFactory初始化环节。
问题核心
为什么测试代码可以正常运行,编译后执行却报错?问题出在哪里?
解决方案
问题出在createSessionFactory方法的循环逻辑中:
for (Class<?> c : clazz) { configuration.addAnnotatedClass(c.getClass()); }
这里的c已经是Class<?>类型,调用c.getClass()会得到Class<Class>对象,而非你需要注册的实体类Class对象。正确写法应为直接传入c:
for (Class<?> c : clazz) { configuration.addAnnotatedClass(c); }
测试代码中直接调用addAnnotatedClass(PlayerStats.class),能正确注册实体;而生产环境的createSessionFactory错误地注册了Class类本身,导致Hibernate无法识别PlayerStats实体,从而抛出UnknownEntityException。
另外注意实体类构造方法中的placedBlocks参数与字段placed不一致,疑似笔误,建议修正以避免后续问题。
内容的提问来源于stack exchange,提问作者sauuey
相关产品推荐
相关产品推荐

