【问题标题】:Property `packagesToScan` not working属性“packagesToScan”不起作用
【发布时间】:2014-01-17 08:05:00
【问题描述】:

我有一个全名为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 中显示的 entityManagerFactory 的 bean 定义中,测试将通过:

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

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

非常感谢。

更新

Spring的版本是4.0.0.RELEASE

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

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

【问题讨论】:

  • 属性是packagesToScan,它接受包名,而不是通配符。

标签: java spring


【解决方案1】:
<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 上进行了测试

【讨论】:

  • 感谢您的回答。但是,它看起来有点让我困惑。那么,当您说“这两个属性”时,您究竟指的是哪两个属性?此外,您是说 persistenceUnitName 应该定义一个名称而不是从持久性 xml 中引用一个名称?无论如何,非常感谢您的澄清。
【解决方案2】:

在您的配置文件中尝试以下行

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2016-02-06
    • 2011-03-31
    • 2018-11-19
    • 2012-07-23
    相关资源
    最近更新 更多