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

使用EntityManager的Spring Boot+Hibernate JPA配置

朱昊乾
2023-03-14

首先我想写:我知道为Spring Boot配置Hibernate JPA不是一个好主意,怎么说“这很愚蠢”,因为Spring Boot给了你自动配置等。好吧,我知道,但我正在自学Spring和Hibernate,我想一步一步地配置Hibernate,并注入Spring上下文。所以,我的问题是,我配置了Hibernate并将类写到配置中,它使用“persitence.xml”。@PersistenceContext的配置正常,EntityManager工作正常。但是,如果@Entity不包括在“persistence.xml”文件中,则不会添加到Hibernate上下文中。

build.gradle是针对jar文件的,这就是问题所在?

plugins {
    id 'org.springframework.boot' version '2.1.9.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

group = 'com.kamil'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    compile("org.springframework.boot:spring-boot-starter-web")
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.0.RELEASE'
/*  compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.6.Final'
    compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.4.8.Final'*/
    compile("com.h2database:h2")

    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.18'
}

JPA的配置类:

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class HibernateConfiguration {

    @Bean(name = "entityManagerFactory")
    public LocalEntityManagerFactoryBean entityManagerFactoryBean(){
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("MySQL");
        return factoryBean;
    }

    @Bean(name = "transactionManager")
    public JpaTransactionManager JpaTransactionManagerBean(){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
        System.out.println("EMF "+entityManagerFactoryBean().getObject().toString());
        return transactionManager;
    }

}

谢谢回复。如果我理解错了,请指正。

共有1个答案

单于亮
2023-03-14

添加我的评论作为答案,让我知道这是否有帮助:

来自LocalContainerEntityManagerFactoryBean文档:

与LocalEntityManagerFactoryBean一样,根据一般的JPA配置协定,配置设置通常从类路径中的META-INF/persistence.xml配置文件中读取。但是,这个FactoryBean更加灵活,因为您可以重写persistence.xml文件的位置,指定要链接到的JDBC数据源,等等。

不使用LocalEntityManagerFactoryBean,您可以执行以下操作:

LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setPackagesToScan("pkg.containing.entities");

如果您想继续使用persistence.xmlLocalEntityManagerFactoryBean,可以通过向persistence.xml文件添加以下内容来尝试Hibernate自动检测功能

<property name="hibernate.archive.autodetection" value="class"/>

有关如何在这种情况下设置persistence.xml的更多信息,请参见本文。

 类似资料:
  • 我正在用SpringBoot配置Consor,并在这里找到了一个文档。即使浏览了其他资源,也没有找到其他配置或场景。 因此,我很好奇当springboot应用程序与consul集成时是否只有这些配置可用。我想深入了解,有人能让我知道任何其他可用的属性吗?

  • 问题内容: 我正在使用Hibernate JPA。我下面有Oracle存储过程。 如何调用此存储过程? 问题答案: 检查这个SO问题: 首先,您定义名为本地查询的存储过程: 然后使用以下命令执行它:

  • 我正在尝试将Apache shiro 1.7.0添加为安全管理器,您会发现我的配置类: shiro的pom.xml条目: 该项目编译成功,但我得到了上面的错误,而试图访问web应用程序,我感谢任何麻或建议。 启动Tomcat上下文时出错。异常:org.springframework.beans.factory.beancreationexception。消息:创建类路径资源[org/apache/

  • 我已经验证了@transaction方法是否正确放置,并且在调试堆栈中,我看到事务拦截器和实体管理器是根据对后端的请求创建的(因此没有guice持久性过滤器) 我的感觉表明问题在于会话上下文。我感觉(但我不能真正理解)它在多个请求上重用了我的持久性上下文。 我已经把一些框架放在一起,使这一切都能工作。我使用resteasy作为jax的实现者。guice(4.0beta4)作为cdi实现者,hibe

  • 我正在尝试在我的Jersey/Hk2应用程序中注入EntityManagerFactory(作为一个单例)和EntityManager(在请求范围中)。 My EntityManagerFactoryProvider(单例): My EntityManagerProvider(每个请求)为: 我的应用程序是: 和web.xml 多谢