2011-12-01 59 views
2

我正在使用SpringRoo來處理我的實體對象的休眠狀態。RooEntity未映射

但運行單元測試時,他們都失敗,因爲它說的實體沒有被映射:

以下是錯誤:

QuerySyntaxException:票面利率不映射[選擇o FROM COUPON O] 在org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)

這是我的持久化單元配置,如:

<persistence-unit name="persistenceUnitTest" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     <property name="hibernate.archive.autodetection" value="class"/> 
     <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> 
     <property name="hibernate.connection.charSet" value="UTF-8"/> 
    </properties> 
</persistence-unit> 

這是我的實體是如何定義的:

@RooJavaBean 
@RooToString 
@RooEntity(identifierColumn = "COUPONID", identifierType = Integer.class, table = "COUPON") 
public class Coupon { 

應用程序上下文設置:

<context:component-scan base-package="com.tamiflu.entities"> 
    <context:exclude-filter expression=".*_Roo_.*" type="regex"/> 
</context:component-scan> 

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> 
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="persistenceUnitName" value="persistenceUnitTest"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
    <property name="url" value="jdbc:hsqldb:mem:tamiflu"/> 
    <property name="username" value="sa"/> 
    <property name="password" value=""/> 
    <property name="testOnBorrow" value="true"/> 
    <property name="testOnReturn" value="true"/> 
    <property name="testWhileIdle" value="true"/> 
    <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
    <property name="numTestsPerEvictionRun" value="3"/> 
    <property name="minEvictableIdleTimeMillis" value="1800000"/> 
</bean> 

我覺得我有一切就緒。我不知道爲什麼@RooEntity沒有被映射。

回答

0

Mikko Maunu是正確的,您的SELECT對於JPA不正確,正確的是SELECT o FROM Coupon o。

@RooJpaActiveRecord是即將發佈的Roo:1.2(目前在RC1中)的新註釋,而@Entity是當前1.1.5和Roo早期版本的新註釋。

如果問題仍然存在:

  1. 審查你的實體。 Roo在AspectJ文件(.aj擴展,如_Roo_Entity或_Roo_Jpa_ActiveRecord)中生成該方法,但可以將其移入(或推入)Java文件。看看找到的方法是否有正確的語法(你必須使用實體的名稱而不是表名,如Mikko Maunu所說)
  2. 查看掃描的軟件包。在applicationContext中查找上下文:component-scan元素,並查看您要加載的實體是否屬於基礎包的子包,即com.tamiflu.entities。

第二點的註釋:Roo創建使用通配符加載應用程序上下文文件的代碼。

如果您有多個訂單,請注意,因爲訂單不能保證(如果您有多個包含不同包的文件需要掃描,您將遇到加載實體的問題,除非您強制刪除通配符並手動指定訂單applicationContext.xml文件的期望順序)