【发布时间】:2021-01-26 12:14:29
【问题描述】:
我目前正在将一个旧的 Spring 项目转移到 Spring boot。在旧项目中,我们在 xml 上下文中显式地初始化数据源和会话工厂。但是在迁移到 Spring Boot 之后,一切都是通过 Spring boot 和 application.properties 隐式发生的。
我的问题是,在没有明确创建/初始化数据源和sessionFactory 的情况下,如何将annotatedClasses 添加到hibernateSessionFactory?我可以通过application.properties 做吗?
这是之前的上下文的样子:
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>com.example.myEntity</value>
</list>
</property>
我们正在使用以下版本:
春季:5.1.15.RELEASE, 弹簧启动:2.1.14.RELEASE, 休眠:5.4.15.Final
快速说明:
所以整个项目已经通过适当的注释进行了迁移。问题只出现在我们正在创建查询的 Dao 中。错误是该查询中引用的实体未映射。
查询创建如下所示:
getSession().createQuery("from TemplateImpl t");
我得到的错误是:
org.hibernate.hql.internal.ast.QuerySyntaxException: TemplateImpl is not mapped.
Dao 用 Repository 和 Transactional 注释,而 entity (TemplateImpl) 用 Entity 注释。
我还需要显式地向 sessionFactory 添加 annotatedClasses 吗?如果不是,那为什么我会收到此错误?
【问题讨论】:
-
使用
@ImportResource加载xml,而不是尝试转换所有内容。首先使用现有的 XML 文件获取一个工作应用程序,使用@ImportResource加载它们。然后开始将内容转移到基于 java 的配置和/或使用 Spring Boot 自动配置。再一次,婴儿步骤一次做 1 颗豆子。 -
我已经过了那个阶段。我已经用新的更新更新了这个问题。可以看看吗?
-
检查您的表是否正确映射到您的实体类。 javabeat.net/hibernate-querysyntaxexception/….
-
查询使用的是实体的确切名称。正如您共享的链接中所述。
-
如果您遵循最佳实践(即覆盖所有其他包的顶级包中的
@SpringBootApplication注释类),则应选择您的实体。如果不是这种情况,您可能需要添加@EntityScan。此外,您不应该直接(最好)使用 Hibnernate,而是使用EntityManager并切换到 JPA。在 JPA 的当前状态下,您很少需要 Hibernate,如果确实需要,您可以简单地将unwrap转换为Session。这也允许您利用 JPA 自动配置。
标签: java spring spring-boot hibernate