You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:21:00