属性`packagesToScan`无法正常工作

时间:2014-01-17 08:05:01

标签: java spring

我有一个实体类,其全名是foo.bar.Book。我写了一个简单的测试类,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/beans-test.xml", "/dataSource-test.xml"})
public class BookTest {

    @PersistenceContext EntityManager entityManager;

    @Transactional
    @Test
    public void test() {
        Book book = new Book();
        book.setTitle("Hello");

        entityManager.persist(book);
    }
}

dataSource-test.xml,我有

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-test.xml" />
    <property name="persistenceUnitName" value="tempWarPU" />
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="foo.bar.*" />
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
    </property>
</bean>

请注意,上面有一个属性packagesToScan,可以让Spring找到foo.bar.Book。但是,这没有发生。我收到这样的错误:

java.lang.IllegalArgumentException: Unknown entity: foo.bar.Book

然而,如果我将下面的行添加到persistence-test.xml的bean定义中显示的entityManagerFactory,测试将会通过:

<class>foo.bar.Book</class>

所以,在我看来packagesToScan属性并没有真正起作用。真的吗?如果是这样,我如何让Spring自动扫描实体类?我尝试将<exclude-unlisted-classes>false</exclude-unlisted-classes>放入persistence-test.xml,但这没有帮助。

非常感谢。

更新

Spring的版本是4.0.0.RELEASE

我也尝试过非通配符,如下所示,但没有运气。

<property name="packagesToScan" value="foo.bar" />

2 个答案:

答案 0 :(得分:3)

<property name="persistenceUnitName" value="test-pu" />
<property name="packagesToScan">
    <list>
        <value>abc.xyz.entity.**.*</value>
    </list>
</property>

这两个属性不能一起工作。
1. persistence.xml存在且LocalContainerEntityManagerFactoryBean指定persistenceUnitName 2. LocalContainerEntityManagerFactoryBean使用scan定义持久性单元。

如果你想检查这个行为调试:org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager 方法:readPersistenceUnitInfos,buildDefaultPersistenceUnitInfo

在春季3.2.8上进行测试

答案 1 :(得分:-1)

在配置文件中尝试以下行

<property name="packagesToScan" value="foo.bar" />