Java 定义持久化单元时如何注入SessionFactory?

Java 定义持久化单元时如何注入SessionFactory?,java,spring,hibernate,Java,Spring,Hibernate,我有一个完全工作的Spring4+Hibernate应用程序。Hibernate是通过配置的。。。我的单元测试可以毫无问题地完成所有与DB相关的工作。但是现在我想访问Hibernate会话;为此,我应该注入SessionFactory。考虑到以下配置,如何注入它 我知道我可以定义一个bean,比如LocalSessionFactoryBean,但不知道如何配置它。(我也不想要重复的配置。) MyTest.java @RunWith(SpringJUnit4ClassRunner.class) @

我有一个完全工作的Spring4+Hibernate应用程序。Hibernate是通过
配置的。。。我的单元测试可以毫无问题地完成所有与DB相关的工作。但是现在我想访问Hibernate会话;为此,我应该注入
SessionFactory
。考虑到以下配置,如何注入它

我知道我可以定义一个bean,比如
LocalSessionFactoryBean
,但不知道如何配置它。(我也不想要重复的配置。)

MyTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:META-INF/spring/test-context.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class})
public class MyTest {

    @Inject
    SessionFactory sessionFactory; // want it injected

}
test-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <context:annotation-config/>
    <context:component-scan base-package="com.mycompany"/>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="hibernateJpaVendorAdapter"
          class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="persistenceUnitName" value="my-persistence-unit"/>
    </bean>
</beans>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="..." version="2.0">
    <persistence-unit name="my-persistence-unit" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/my</jta-data-source>
        <class>com.mycompany.entity.Document</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.archive.autodetection" value="class, hbm"/>
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
        </properties>
    </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence
java:jboss/datasources/my
com.mycompany.entity.Document
假的

因为我使用JPA,我应该注入
EntityManager
,而不是
SessionFactory
。这最终解决了我的任务

@PersistenceContext
private EntityManager entityManager;
...
entityManager.refresh(obj); // working with H-session
...

这正是@m-deinum的评论;如果他会添加自己的答案,那么我会将其标记为决策。

您使用的是JPA,因此您应该使用
EntityManager
而不是
SessionFactory
。为什么
@Inject SessionFactory SessionFactory
不起作用?有什么错误吗?看起来这和你想要的是一样的: