2017-02-13 172 views
0

我得到异常Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Building is not mapped [from Building] 我的建筑类映射的实体未映射

@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"); 
     .... 
    } 

代码抛出EXCETION

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; 
} 

而且我setuped

@Bean 
    public LocalSessionFactoryBean localSessionFactoryBean(DataSource ds) throws ClassNotFoundException { 
     LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean(); 
     localSessionFactoryBean.setDataSource(dataSource()); 
     return localSessionFactoryBean; 
    } 
+0

看起来像'Building'类本身或'AbstractModel'有问题。很难说,许多细节被省略 – Andremoniy

+0

为什么要配置一个JPA EntityManagerFactory,但开始使用普通的Hibernate?您还需要相应地设置'SessionFactory'(尽管我会建议仅使用JPA而不是简单的休眠)。 –

+0

你使用javax.persistence.Table or org.hibernate.annotations.Table吗? –

回答

1

配置的是EntityManagerFactory这是与JPA使用,但是在你的代码使用的是原生的Hibernate API,这需要一个正确配置的SessionFactory代替。

而不是使用普通的hibernate,我强烈建议只是简单地使用JPA。只需重写代码即可使用EntityManager而不是Session和/或HibernateTemplate(后者是您应该避免使用的内容,因为从休眠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; 
} 
+0

不幸的是,hibernate 5是这个项目的技术规范的一部分,所以我不能避免它 – MolecularMan

+0

正如前面所述,你使用hibernate的事实,并不意味着你不能使用JPA ...... Hibernate == JPA Provider。 。因此,您可以在使用JPA时完美遵守该技术规范。 –

+0

感谢您的建议,我会操作您的答案,如果有的话,并使用Spring数据 – MolecularMan