当前位置: 首页 > 知识库问答 >
问题:

为什么我的Hibernate实体(消息)没有映射?

师向文
2023-03-14

我在配置类中使用spring boot和hibernate。未映射我的实体。请参阅下面的错误。在看了其他一些关于这个的stackoverflow页面后,我仍然无法理解。

我相信以下是正确的:HQL、@实体、@表

错误。

org.hibernate.hql.internal.ast.QuerySyntaxException: Message is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:169) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:79) ~[hibernate-core-5.4.2.Final.jar:5.4.2.Final]

实体。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity(name = "strunk.entities")
@Table(name = "Message")
public class Message {

code...
}

DAO类

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import strunk.entities.Message;

@Repository
public class MessageRepoImpl implements MessageRepo {
    
    @Autowired
    private SessionFactory sf;

    @Override
    public List<Message> getMessages() {
        Session sess = sf.openSession();
        List<Message> messages = null;

        try {
            messages = sess.createQuery("FROM Message").list();
        } catch (HibernateException e) {
            e.printStackTrace();
        } finally {
            sess.close();
        }
        
        return messages;
    }

    more code...
}

当我将getMessages方法主体替换为以下内容时,它会起作用

        Session sess = sf.openSession();
        List<Message> messages = sess.createNativeQuery(
                "SELECT * FROM Message" )
            .list();
        return messages;

数据库表名称为“消息”。

SpringBoot类

@SpringBootApplication(exclude= HibernateJpaAutoConfiguration.class)
@ComponentScan("strunk")
@EnableJpaRepositories("strunk")
@EntityScan("strunk")
public class InstantMessengeTranslatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(InstantMessengeTranslatorApplication.class, args);
    }

}

Hibernate配置类

package strunk.config;

import java.io.FileInputStream;
import java.util.Properties;
import javax.sql.DataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;


@Configuration
@EnableTransactionManagement
@PropertySource(value = {"classpath:application.properties"})
public class HibernateConfig {
    
    @Value("${spring.datasource.driver-class-name}")
    private String driverClass;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${hibernate.dialect}")
    private String dialect;
    
    @Bean
    public DataSource getDatasource(){
        DriverManagerDataSource datasource = new DriverManagerDataSource(url, username, password);
        datasource.setDriverClassName(driverClass);
        return datasource;
    }
    
    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", dialect);
        properties.put("hibernate.hbm2ddl.auto", "update");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.format_sql", "true");
        return properties;
    }
    
    @Bean
    public LocalSessionFactoryBean sessionFactory(){
        LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
        factory.setDataSource(getDatasource());
        factory.setHibernateProperties(hibernateProperties());
        factory.setPackagesToScan(new String[] {"com.xadmin.springboothibernate.model"});
        return factory;
    }
    
    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory factory)
    {
        HibernateTransactionManager transactionManger = new HibernateTransactionManager();
        transactionManger.setSessionFactory(factory);
        return transactionManger;   
    }
}

我错过了什么?

共有2个答案

阎裕
2023-03-14

问题是,在Hibernate config类中,setPackagesToScan()引用的包不正确。谢谢你,亚历克斯。

华涵意
2023-03-14

在Springbean初始化期间,使您的实体类处于初始化状态。如果它没有在组件扫描中添加,那么它将不会被视为bean类,并且Hibernate将通过错误。

 类似资料:
  • 我被要求为基于hibernate的数据访问对象编写一些代码测试。 我想我会从一个简单的测试开始:当我保存一个模型时,它应该在返回的集合中。问题是,无论如何,当我调用时,它总是一个空集合。 应用程序代码已经在生产中工作,所以让我们假设问题只是出在我的测试代码上。 预期测试输出为: 到目前为止,我已经尝试在插入后显式提交,并禁用缓存,但这并不奏效。 我不想成为冬眠大师,也没有足够的时间阅读整个留档。在

  • 我需要在我现有的Spring Boot 1.2.5应用程序中编写一些临时代码来执行一些复杂的SQL查询。所谓复杂,我指的是关于4个不同表的单个查询,我有很多这样的表。我们都决定使用现有的SQL来降低新查询出错的潜在风险,在这种情况下,这是一个很好的方法。 我的应用程序使用JPA / Hibernate并将一些实体映射到表。从我的研究来看,似乎我必须做很多实体映射。 我尝试编写一个类,该类只获取Hi

  • 我不确定该如何表述这个问题,但我目前面临的问题是,为什么我的LoginActivity在启动时没有显示。下面是我的代码 因此,为了让您想要的activity首先显示,您必须替换您想要的右侧上方的那个?但替换后,不知何故我的loginActivity并不是显示的第一个屏幕。我尝试将忘记帐户和signupActivity替换为启动时显示的第一个屏幕,并且两者都按预期显示。然而,对于我的LoginAct

  • 在Hibernate继承映射中,JPA每类表策略, 根实体不需要表来映射, 子实体做,每个子实体都有一个表。 在我的理解中,实体是:带有映射配置的java类,它应该映射到一个表, 那么,如果没有要映射的表,根实体如何作为实体存在呢? 如果它不需要一个表来映射,我们为什么不用一个@mappedSuperclass呢? 我们可以使用此根实体进行查询吗?

  • 我正在尝试用Spring 3、JPA 2和Hibernate 3制作一个应用程序。我有一个问题,当你坚持一个实体:什么都没发生!数据不插入数据库,也不执行查询。但是,当我使用一个请求,如query.getResultList()选择正常工作。 所以我认为我的问题只是在坚持/更新和事务管理器上,但我不太擅长Spring。你能帮帮我吗? 下面是我的配置文件: 谁能帮帮我吗?

  • 我正在做一个装在盒子里的计数器。我试图使这个计数器对不同的屏幕大小做出响应,但由于某些原因,我试图使用的媒体查询将无法工作。 我曾尝试将设备宽度更改为768px以下,但查询对计数器没有影响,我不确定原因。我已经包括了计数器的HTML/PHP代码以及CSS。有人知道为什么它不起作用吗 我已确保此标签包含在文档的标题中。 超文本标记语言: CSS: