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