当前位置: 首页 > 知识库问答 >
问题:

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

储国发
2023-03-14

我有一个完全工作的Spring 4 Hibernate应用程序。Hibernate通过<代码>

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

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>

持久性.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>

共有1个答案

何玺
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我需要使用一个数据库进行查询(非修改),而使用一个数据库进行命令(修改)。我正在使用Spring Data JPA,所以我有两个配置类: 在我的存储库中,有时我需要决定与EntityManager一起使用,如下所示: 我使用在我的定义持久性单元的名称 的persistence.xml : 定义了弹簧抛出。奇怪的是,看起来Spring尝试使用持久性单元名称实例化 bean ?我配置错误了

  • 我有以下设置: EJB-JAR: 包含一些实体和DAO。 保存DAOS中使用的EntityManager的persistence.xml。 测试-战争: 包含一个servlet,它注入EJB-JAR的DAO之一(使用@inject或@ejb)。 问题是: > 我当前正在将应用程序部署到Wildfly 8.x 当我用一个在部署后启动的单例来部署jar时,我就能够按照预期使用DAOs。我正在从数据库得

  • 我正在开发Hibernate JPA持久性Web应用程序,我的persistence.xml在src/main/Resources/META-INF/persistence.xml(在war文件中,它在WEB-INF/class/META-INF中)。这一切在本地Tomcat服务器上运行良好,但当放在Openshift JBoss EWS上时,在启动时收到此消息: 坚持不懈xml以 并且有两个持久

  • 最后的修正:由于Vlad的回答,我能够更新代码以使用以下内容(只需确保您还定义了bean):

  • 我正在编写一个独立的java应用程序,从Maven项目构建它并通过调用jar文件执行。 在应用程序中,我有一个实体管理器,它使用在我的持久性中定义的持久性单元。xml是独立的(事务类型=“RESOURCE\u LOCAL”) 实际的实体注释类来自另一个项目,因此被添加到pom中。xml文件作为依赖项。 问题是持久性。包含实体类的项目的xml覆盖了实际独立应用程序的持久性。构建jar时,jar目标文

  • 问题内容: 在构建应用程序时会创建persistence.xml中的持久性单元。由于我想在运行时更改数据库URL,是否有任何方法可以在运行时修改持久性单元?我应该使用其他数据库,而不是在分发后预先绑定一个数据库。 我正在使用EclipseLink(JPA 2.1) 问题答案: 保持持久性单元文件(Persistence.xml)不变。您可以按如下所示覆盖其中的属性。