我有一个实体类,其全名是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" />
答案 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" />