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.RELEASE
和Hibernate 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 中不起作用