java - Spring Boot + Hibernate JPA 配置以使用 EntityManager

标签 java spring hibernate spring-boot jpa

首先我想写: 我知道为 Spring Boot 配置 Hibernate JPA 并不是一个好主意,也知道怎么说“这很愚蠢”,因为 Spring boot 为您提供了自动配置等功能。 好的,我知道,但我正在自学 Spring 和 Hibernate,我想一步一步配置 Hibernate 并注入(inject)到 Spring Context。 所以,我的问题是,我配置 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;
    }

}

当我在“persistence.xml”文件中时,实体就可以了。但如果没有,“未知实体”就会抛出。 是否可以在“persistence.xml”中避免并仅在该应用程序配置中使用实体的注释?这意味着 Spring Boot jar + Hibernate JPA ?

我知道这是 Spring Boot 中的 Spring Data JPA,但是如果我以该形式进行配置,我将看到 JPA 的更多详细信息。我使用 SpringBoot、Spring Framework 和 Hibernate 文档。

谢谢回复。如果我理解有误,请指正。

最佳答案

添加我的评论作为答案,请告诉我是否有帮助:

来自 LocalContainerEntityManagerFactoryBean 文档:

As with LocalEntityManagerFactoryBean, configuration settings are usually read in from a META-INF/persistence.xml config file, residing in the class path, according to the general JPA configuration contract. However, this FactoryBean is more flexible in that you can override the location of the persistence.xml file, specify the JDBC DataSources to link to, etc.

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

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

如果您想保留 persistence.xmlLocalEntityManagerFactoryBean ,您可以通过将以下内容添加到 persistence.xml 文件来尝试 Hibernate 自动检测功能

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

参见this了解有关如何为此情况设置 persistence.xml 的更多信息。

关于java - Spring Boot + Hibernate JPA 配置以使用 EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58963183/

相关文章:

java - 添加二进制数

java BufferedReader 和 Writer 无法按预期工作

spring - 是什么导致了 "No property find found for type"spring数据jpa错误

java - 覆盖交易方法

hibernate - 我应该依靠脏检查吗?

hibernate - 使用AbstractPersistenceEventListener进行透明加密

javafx快照性能低下

java - 是否可以使用框架 spring 5 运行 java 10?

java - Spring 批处理分区中网格大小的动态值

java - Spring 安全。 protected 注释不起作用