2017-02-13 263 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