RooEntity未映射

时间:2011-12-01 11:23:25

标签: hibernate spring-roo hibernate-mapping

我正在使用SpringRoo来处理实体对象的休眠。

但是在运行单元测试时,它们会失败,因为它表示实体未映射:

这是错误:

QuerySyntaxException:未映射COUPON [SELECT 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没有被选中作为映射。

1 个答案:

答案 0 :(得分: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中查找context:component-scan元素并查看您要加载的实体是否属于base-package的子包,在您的情况下是com.tamiflu.entities。
  3. 关于第二点的注释:Roo创建了使用通配符加载应用程序上下文文件的代码。

    如果您有多个,请小心,因为订单无法保证(如果您有多个文件包含不同的软件包进行扫描,您将遇到加载实体的问题,除非您强行删除通配符并手动指定applicationContext.xml文件的所需顺序)