未映射的实体
Entity in not mapped
我遇到异常 Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Building is not mapped [from Building]
我的建筑 class 已映射
@javax.persistence.Entity
@Table(name = "building")
public class Building extends AbstractModel {
AbstractModel 为空(仅用于向上转换)
正在设置 packagesToScan
@Primary
@Bean
@Autowired
public EntityManagerFactory entityManagerFactory(DataSource dataSource) {
....
localContainerEntityManagerFactoryBean.setPackagesToScan("com.app.persistence.model");
....
}
代码抛出异常
public <M extends AbstractModel> List<M> findAll() {
List<Building> buildings;
try {
buildings = (List<Building>) getHibernateTemplate().find("from Building");
} catch (Exception e) {
throw e;
}
return (List<M>) buildings;
}
我还设置了
@Bean
public LocalSessionFactoryBean localSessionFactoryBean(DataSource ds) throws ClassNotFoundException {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource());
return localSessionFactoryBean;
}
您正在配置一个用于 JPA 的 EntityManagerFactory
,但是在您的代码中您使用的是纯 Hibernate API,它需要正确配置的 SessionFactory
。
我强烈建议不要使用普通的 hibernate,而是简单地使用 JPA。只需重写您的代码以使用 EntityManager
而不是 Session
and/or HibernateTemplate
(后者是您应该避免使用的东西,因为自 hibernate 3.0.1 以来不再推荐使用!)。
@PersistenceContext
private EntityManager em;
public <M extends AbstractModel> List<M> findAll() {
return em.createQuery("select b FROM Building b", Building.class).getResultList();
}
并删除普通休眠设置,即 LocalSessionFactoryBean
配置和 HibernateTemplate
设置。
这就是您所需要的。现在,如果您将 Spring Data JPA 添加到组合中,您甚至不需要它,您只需要一个 BuildingRepository
接口。
public interface BuildingRepository extends JpaRepository<Building, Long> {}
假设id是Long
类型。
如果您真的想使用纯 Hibernate(如前所述,我不推荐这样做),您需要正确配置 LocalSessionFactoryBean
并为其指定 packagesToScan
。
@Bean
public LocalSessionFactoryBean localSessionFactoryBean(DataSource ds) throws ClassNotFoundException {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource());
localSessionFactoryBean.setPackagesToScan("com.app.persistence.model");
return localSessionFactoryBean;
}
我遇到异常 Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Building is not mapped [from Building]
我的建筑 class 已映射
@javax.persistence.Entity
@Table(name = "building")
public class Building extends AbstractModel {
AbstractModel 为空(仅用于向上转换)
正在设置 packagesToScan
@Primary
@Bean
@Autowired
public EntityManagerFactory entityManagerFactory(DataSource dataSource) {
....
localContainerEntityManagerFactoryBean.setPackagesToScan("com.app.persistence.model");
....
}
代码抛出异常
public <M extends AbstractModel> List<M> findAll() {
List<Building> buildings;
try {
buildings = (List<Building>) getHibernateTemplate().find("from Building");
} catch (Exception e) {
throw e;
}
return (List<M>) buildings;
}
我还设置了
@Bean
public LocalSessionFactoryBean localSessionFactoryBean(DataSource ds) throws ClassNotFoundException {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource());
return localSessionFactoryBean;
}
您正在配置一个用于 JPA 的 EntityManagerFactory
,但是在您的代码中您使用的是纯 Hibernate API,它需要正确配置的 SessionFactory
。
我强烈建议不要使用普通的 hibernate,而是简单地使用 JPA。只需重写您的代码以使用 EntityManager
而不是 Session
and/or HibernateTemplate
(后者是您应该避免使用的东西,因为自 hibernate 3.0.1 以来不再推荐使用!)。
@PersistenceContext
private EntityManager em;
public <M extends AbstractModel> List<M> findAll() {
return em.createQuery("select b FROM Building b", Building.class).getResultList();
}
并删除普通休眠设置,即 LocalSessionFactoryBean
配置和 HibernateTemplate
设置。
这就是您所需要的。现在,如果您将 Spring Data JPA 添加到组合中,您甚至不需要它,您只需要一个 BuildingRepository
接口。
public interface BuildingRepository extends JpaRepository<Building, Long> {}
假设id是Long
类型。
如果您真的想使用纯 Hibernate(如前所述,我不推荐这样做),您需要正确配置 LocalSessionFactoryBean
并为其指定 packagesToScan
。
@Bean
public LocalSessionFactoryBean localSessionFactoryBean(DataSource ds) throws ClassNotFoundException {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource());
localSessionFactoryBean.setPackagesToScan("com.app.persistence.model");
return localSessionFactoryBean;
}