属性“包扫描”不起作用



我有一个全名是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

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

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

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

谢谢。

更新

春天的版本是4.0.0.RELEASE .

我也尝试了下面的非通配符方式,但没有运气。

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

这两个属性不能一起使用。
1. 持久性.xml存在和 LocalContainerEntityManagerFactoryBean 指定持久性单元名称2. LocalContainerEntityManagerFactoryBean通过扫描定义持久性单元。

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

在春季进行了测试3.2.8

在配置文件中尝试以下行

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

最新更新