spring.jpa.hibernate.ddl-auto=create 在带有 SpringBoot 2.0 的 Hibernate 5 中不起作用

Posted

技术标签:

【中文标题】spring.jpa.hibernate.ddl-auto=create 在带有 SpringBoot 2.0 的 Hibernate 5 中不起作用【英文标题】:spring.jpa.hibernate.ddl-auto=create is not working in Hibernate 5 with SpringBoot 2.0 【发布时间】:2018-09-16 08:43:06 【问题描述】:

我创建了SpringBoot 1.5.11.RELEASEHibernate 5 project。一切正常。

但是,当我将 SpringBoot 版本更改为 2.0.0.RELEASE 时,spring.jpa.hibernate.ddl-auto=create 不起作用。我试过this *** post,但没有运气。

这是SpringBoot 1.5.11.RELEASE的堆栈跟踪:

2018-04-06 16:27:52.512 信息 6792 --- [主要] j.LocalContainerEntityManagerFactoryBean : 构建 JPA 容器 持久性单元“默认”的 EntityManagerFactory 2018-04-06 16:27:52.526 信息 6792 --- [主要] o.hibernate.jpa.internal.util.LogHelper:HHH000204:处理中 PersistenceUnitInfo [名称:默认...] 2018-04-06 16:27:52.587 信息 6792 --- [主] org.hibernate.Version : HHH000412: Hibernate Core 5.0.12.Final 2018-04-06 16:27:52.589 信息 6792 --- [主] org.hibernate.cfg.Environment :HHH000206:找不到hibernate.properties 2018-04-06 16:27:52.591 信息 6792 --- [主] org.hibernate.cfg.Environment :HHH000021:字节码提供者名称:javassist 2018-04-06 16:27:52.735 信息 6792 --- [主要] o.hibernate.annotations.common.Version:HCANN000001:休眠 Commons Annotations 5.0.1.Final 2018-04-06 16:27:52.833 INFO 6792 --- [主要] org.hibernate.dialect.Dialect:HHH000400:使用方言:org.hibernate.dialect.mysql5Dialect 2018-04-06 16:27:53.180 信息 6792 --- [主要] org.hibernate.tool.hbm2ddl.SchemaExport:HHH000227:运行 hbm2ddl 模式导出 Hibernate:如果存在则删除表 人 Hibernate:创建 表人(id 整数不为空 auto_increment,名称 varchar(255), 主键 (id)) 2018-04-06 16:27:53.619 INFO 6792 --- [ 主要] org.hibernate.tool.hbm2ddl.SchemaExport:HHH000230:架构 导出完成 2018-04-06 16:27:53.646 INFO 6792 --- [ main] j.LocalContainerEntityManagerFactoryBean : 初始化的 JPA EntityManagerFactory 用于持久性单元“默认”SessionFactory 创建于 2018-04-06 16:27:54.528 WARN 6792 --- [主] org.hibernate.orm.connections:HHH10001002:使用 Hibernate 内置连接池(不用于生产!) 2018-04-06 16:27:54.529 信息 6792 --- [主要] org.hibernate.orm.connections:HHH10001005:使用驱动程序 [com.mysql.jdbc.Driver] 在 URL [jdbc:mysql://localhost:3306/hotel] 2018-04-06 16:27:54.529 信息 6792 --- [主要] org.hibernate.orm.connections:HHH10001001:连接 属性:用户=root,密码=**** 2018-04-06 16:27:54.529 信息 6792 --- [主要] org.hibernate.orm.connections : HHH10001003:自动提交模式:假 2018-04-06 16:27:54.532 INFO 6792 --- [主] .c.i.DriverManagerConnectionProviderImpl :HHH000115:休眠连接池大小:10(min = 1)2018-04-06 16:27:54.539 信息 6792 --- [主要] org.hibernate.dialect.Dialect:HHH000400:使用方言: org.hibernate.dialect.MySQL5Dialect 2018-04-06 16:27:54.855 INFO 6792 --- [main] o.s.j.e.a.AnnotationMBeanExporter : 在启动时注册 bean 以便 JMX 暴露 Hibernate: 插入 人(姓名)值(?)已保存! 2018-04-06 16:27:54.954 信息 6792 --- [main] com.hib.Hibernate5Application:在 4.051 秒内启动 Hibernate5Application(JVM 运行 4.802)


这是SpringBoot 2.0.0.RELEASE的堆栈跟踪:

SessionFactory 创建于 2018-04-06 16:24:17.011 INFO 5092 --- [ 主要] org.hibernate.Version:HHH000412:休眠 核心 5.2.14.Final 2018-04-06 16:24:17.013 INFO 5092 --- [ 主要] org.hibernate.cfg.Environment:HHH000206: hibernate.properties 未找到 2018-04-06 16:24:17.915 INFO 5092 --- [主要]o.hibernate.annotations.common.Version: HCANN000001:Hibernate Commons 注释 5.0.1.Final 2018-04-06 16:24:17.989 警告 5092 --- [主要] org.hibernate.orm.connections.pooling:HHH10001002:使用 Hibernate 内置连接池(不用于生产!) 2018-04-06 16:24:17.994 信息 5092 --- [主要] org.hibernate.orm.connections.pooling:HHH10001005:使用驱动程序 [com.mysql.jdbc.Driver] 在 URL [jdbc:mysql://localhost:3306/hotel] 2018-04-06 16:24:17.994 信息 5092 --- [主要] org.hibernate.orm.connections.pooling:HHH10001001:连接 属性:用户=root,密码=**** 2018-04-06 16:24:17.994 信息 5092 --- [主] org.hibernate.orm.connections.pooling: HHH10001003:自动提交模式:假 2018-04-06 16:24:17.996 INFO 5092 --- [main] .c.i.DriverManagerConnectionProviderImpl : HHH000115: Hibernate 连接池大小: 10 (min=1)

2018-04-06 16:24:18.230 信息 5092 --- [主要] org.hibernate.dialect.Dialect:HHH000400:使用方言: org.hibernate.dialect.MySQL5Dialect 2018-04-06 16:24:19.041 INFO 5092 --- [主] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始... 2018-04-06 16:24:19.058 INFO 5092 --- [ 主] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始 完成。

2018-04-06 16:24:19.419 信息 5092 --- [主要] o.s.j.e.a.AnnotationMBeanExporter :为 JMX 注册 bean 启动时曝光 2018-04-06 16:24:19.420 INFO 5092 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : 带有名称的 Bean 'dataSource' 已被自动检测到 JMX 暴露 2018-04-06 16:24:19.427 信息 5092 --- [主要] o.s.j.e.a.AnnotationMBeanExporter :位于 MBean 'dataSource': 向 JMX 服务器注册为 MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource] 2018-04-06 16:24:19.441 信息 5092 --- [主要] com.hib.Hibernate5Application : 已启动 Hibernate5Application in 3.742 seconds (JVM running for 4.541) Hibernate:插入人(姓名)值(?)保存!!


Hibernate 5 配置:

@Configuration
public class HinernateConfig 

    private StandardServiceRegistry standardServiceRegistry;
    private SessionFactory sessionFactory;

    @Bean
    public SessionFactory sessionFactory() 
        try 
            standardServiceRegistry = new StandardServiceRegistryBuilder().configure().build();
            Metadata metadata = new MetadataSources(standardServiceRegistry).getMetadataBuilder().build();
            sessionFactory =  metadata.getSessionFactoryBuilder().build();
            return sessionFactory;
         catch (Exception e) 
            System.out.println("Exception occured while creating SessionFactory");
            e.printStackTrace();
            if (standardServiceRegistry != null) 
                StandardServiceRegistryBuilder.destroy(standardServiceRegistry);
            
        
        return sessionFactory;
    

    @PostConstruct
    public void post() 
        System.out.println("SessionFactory Created");
    



主要应用:

@SpringBootApplication
public class Application implements CommandLineRunner 

    private SessionFactory sessionFactory;

    public Application(SessionFactory sessionFactory) 
        this.sessionFactory = sessionFactory;
    

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

    @Override
    public void run(String... args) throws Exception 
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        Person person = new Person("Mehraj Malik");
        session.save(person);
        System.out.println("Saved!!");
        session.getTransaction().commit();
        session.close();
    


休眠 XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hotel</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">admin</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <mapping class="com.hib.entity.Person"/>
    </session-factory>
</hibernate-configuration>

application.properties

spring.datasource.url = jdbc:mysql://localhost:3306/Hotel
spring.datasource.username=root
spring.datasource.password=admin
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

在 Boot 2.0 堆栈跟踪中,以下部分没有出现:

运行 hbm2ddl 模式导出 Hibernate:如果存在人员,则删除表 Hibernate:创建表人(id整数不为空auto_increment, 名称 varchar(255), 主键 (id))

Github:https://github.com/Mehraj123/Hib5Boot2.0

【问题讨论】:

但是您的代码仍然可以运行,因为您还可以使用 Spring Boot 2.0.0 来保存此人,因为您的日志文件显示:Hibernate5Application in 3.742 seconds (JVM running for 4.541) Hibernate: insert into person (name) values (?) Saved!!。您是否尝试过使用空数据库的 Spring Boot 2.0.0 运行您的应用程序? 您没有使用 JPA,那么为什么要应用 spring.jpa 属性。您正在配置自己的SessionFactory,甚至没有使用application.properties 中定义的属性。另外,为什么要使用普通休眠,使用 JPA 并改用 EntityManager,这样您就不用自己配置 SessionFactory,您可以从 Spring Boot 的自动配置中受益。 @rieckpil 是的,它正在将记录保存到数据库,但是,它应该在插入新记录之前删除表及其数据。 您不应该因此使用create-drop 代替ddl-auto吗? 我要删除基于休眠的配置类和休眠 xml 配置。您正在使用为您自动配置 JPA 的 Spring Boot...您正在尝试进行手动配置(并且仍然希望自动配置能够正常工作),从而使其变得更加复杂。 【参考方案1】:

正如 M.Deinum 所述,我已经删除了以下类和资源文件并且它可以正常工作:

HinernateConfig hibernate.cfg.xml

主应用的变化

@SpringBootApplication
public class Hibernate5Application implements CommandLineRunner 

    private EntityManagerFactory managerFactory;

    public Hibernate5Application(EntityManagerFactory managerFactory) 
        this.managerFactory = managerFactory;
    

    public static void main(String[] args) 
        SpringApplication.run(Hibernate5Application.class, args);
    

    @Override
    @Transactional
    public void run(String... args) throws Exception 
        EntityManager entityManager = managerFactory.createEntityManager();
        entityManager.getTransaction().begin();
        Person person = new Person("Mehraj Malik");
        entityManager.persist(person);
        System.out.println("Saved!!");
        entityManager.close();
    


我已经更新my github repo

【讨论】:

以上是关于spring.jpa.hibernate.ddl-auto=create 在带有 SpringBoot 2.0 的 Hibernate 5 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当为 Postgres DB 的属性 spring.jpa.hibernate.ddl-auto 提供更新值时,Hibernate 不会生成序列

spring.jpa.hibernate.ddl-auto 属性在 Spring 中是如何工作的?

spring.jpa.hibernate.ddl-auto=validate 或更新返回 beans.factory.BeanCreationException

spring.jpa.hibernate.ddl-auto=create 在带有 SpringBoot 2.0 的 Hibernate 5 中不起作用

Spring Boot ddl 自动生成器

spring-boot Jpa配置