文档章节

jPA自动创建数据库表的一些配置

风中帆
 风中帆
发布于 2015/12/26 08:45
字数 1151
阅读 605
收藏 5
点赞 0
评论 0

jPA自动创建数据库表的一些配置


hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下:
<properties>
<property name="hibernate.show_sql" value="true" />      
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>

Hibernate Reference Documentation 3.3.1解释如下:
Automatically validate or export schema DDL to the database when the SessionFactory is created.
With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly.
eg. validate | update | create | create-drop

 


其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。
create:
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

再说点“废话”:
当我们把hibernate.hbm2ddl.auto=create时hibernate先用hbm2ddl来生成数据库schema。
当我们把hibernate.cfg.xml文件中hbm2ddl属性注释掉,这样我们就取消了在启动时用hbm2ddl来生成数据库schema。通常 只有在不断重复进行单元测试的时候才需要打开它,但再次运行hbm2ddl会把你保存的一切都删除掉(drop)---- create配置的含义是:“在创建SessionFactory的时候,从scema中drop掉所以的表,再重新创建它们”。
注意,很多Hibernate新手在这一步会失败,我们不时看到关于Table not found错误信息的提问。但是,只要你根据上面描述的步骤来执行,就不会有这个问题,因为hbm2ddl会在第一次运行的时候创建数据库schema, 后续的应用程序重启后还能继续使用这个schema。假若你修改了映射,或者修改了数据库schema,你必须把hbm2ddl重新打开一次。

***********************************************************

这两天在整理Spring + JPA(Hibernate实现),从网上copy了一段Hibernate连接参数的配置。

<properties>
<property name="hibernate.show_sql" value="true" />      
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
结果在测试时,老是发现数据库表数据丢失。这个参数以前没怎么用,查了一圈其它的东东,最后才定位到这个上面。赶紧查了一下Hibernate的参数配置,解释如下:

hibernate.hbm2ddl.auto Automatically validate or export schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly. eg. validate | update | create | create-drop

其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".

其它几个参数的意思,我解释一下:

validate               加载hibernate时,验证创建数据库表结构
create                  每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop        加载hibernate时创建,退出是删除表结构
update                 加载hibernate自动更新数据库结构

以上4个属性对同一配置文件下所用有的映射表都起作用

 

总结:

1.请慎重使用此参数,没必要就不要随便用。

2.如果发现数据库表丢失,请检查hibernate.hbm2ddl.auto的配置



如果发现数据库表丢失或新增,请检查hibernate.hbm2ddl.auto的配置 可设置 <property name="hibernate.hbm2ddl.auto" value="none" />

建议在开发环境下使用,在生产环境下去掉。

 

优点:

1、自动创建新表

2、自动创建新字段

3、自动修改字段类型

 

缺点:

1、不会自动删除表

2、不会自动删除字段

3、自动创建的新字段只能是在最后。

 

针对缺点的建议:定期把数据库清空(删除所有表),然后启动项目,让hibernate自动创建表结构和索引,当然一些初始化数据需要手工导入。




本文转载自:http://my.oschina.net/u/437803/blog/59038

共有 人打赏支持
风中帆
粉丝 14
博文 193
码字总数 17363
作品 0
青岛
Eclipse 通过JPA自动生成注解实体

hibernate是JPA最常用的实现之一,而且hiberante自身也对注释语法进行了支持。现在再不用去看那一堆堆的XML映射了。而且eclipse还提供了从数据库直接生成Entity Class的工具。 一、项目添加J...

思悟修
2015/04/14
0
0
SSH与SSH2这种框架组合的历史原由

早在2001年时当时的J2EE推崇的是EJB,EJB被称为J2EE的核心,当时要学J2EE就是Servlet+EJB,在EJB里其实早已经有了AOP与实体映射这些概念了。 EJB有三种形态的BEAN,SessionBean, Entity Bea...

天行健J
2012/11/20
0
0
(JavaEE-04)Servlet

Servlet Servlet是sun公司提供的一套专门用于开发动态web资源的技术 sun公司在ServletAPI中提供了一个servlet接口,如果需我们需要开发一个动态web资源,需要两步: * 编写一个Java类,实现s...

_-Leon-_
2014/06/15
0
0
ServletConfig对象学习

1,在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装...

宇宙执政
2014/05/07
0
0
(四)SpringBoot——JPA

一、JPA JPA(Java Persistence API),通过JDK5注解或者xml描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 例如,开源的Hibernate就是遵循JPA规范的,我们经常用到的M...

solidwang
04/23
0
0
JavaWeb09-HTML篇笔记(二)

1.1 案例一:使用Servlet完成一个用户登录的案例.1.1.1 需求: 在网站的首页上,登录的链接,点击登录的链接,可以跳转到登录的页面.在登录的页面中输入用户名和密码点击登录的案例.完成登录的功...

我是小谷粒
05/21
0
0
springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多的mvc框...

noteless
2016/02/24
0
0
Play框架拾遗之四:域模型与JPA支持

1、属性模拟 对于model,Play中字段都是public修饰符,但框架会自动生成setter与getter如: @Entity@Table(name="product ")public class Product extends BaseModel{ @Id public Long id; ......

奋斗到天明
2015/08/27
0
0
由浅入深,解析Java Servlet工作过程

Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成...

在北方玩弹子球
07/13
0
0
Hibernate注解(一)类级别注解

1、Hibernate注解简介 2、JPA与Hibernate的关系 3、Hibernate注解分类 4、@Entity 5、@Table 6、@Embeddable 7、schema与catalog 一、Hibernate注解简介 使用注解的目的:为了简化繁琐的ORM...

leeqico
06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

打印斐波那契数

package com.jerry.ch04;public class PrintFibonacci {public static void main(String[] args) {for (int i=0; i<10; i++) {System.out.print(fib(i) + " ");}......

JerryNing
7分钟前
0
0
shell编程

一、shell脚本介绍

人在艹木中
8分钟前
0
0
istio 0.8 遥测 案例

==============遥测===================================== 演示如何从网格中收集遥测信息。 分布式跟踪。如何配置代理以向Zipkin或Jaeger发送跟踪请求 收集度量标准和日志。此任务说明如何配...

xiaomin0322
10分钟前
0
0
ND4J求多元线性回归以及GPU和CPU计算性能对比

上一篇博客《梯度下降法求多元线性回归及Java实现》简单了介绍了梯度下降法,并用Java实现了一个梯度下降法求回归的例子。本篇博客,尝试用dl4j的张量运算库nd4j来实现梯度下降法求多元线性回...

冷血狂魔
11分钟前
0
0
springboot常用注解

@SpringBootApplication: 包含@Configuration、@EnableAutoConfiguration、@ComponentScan 通常用在主类上。 @Service: 用于标注业务层组件。 @RestController: 用于标注控制层组件(如strut...

GoldenVein
17分钟前
1
0
如何进行大数据的入门级学习?

不知道你是计算机专业应届生还是已经从业者。总之,有java基础的学生学习大数据会轻松很多,零基础的小白都需要从java和linux学起。 如果你是一个学习能力特别强,而且自律性也很强的人的话可...

董黎明
31分钟前
0
0
使用Parcelable传递复杂参数

最近做AIDL传递对象,对象必须实现Parcelable的方法才可以被传递。 @Override    public int describeContents() {//这个 默认返回0就行了。        return 0;    }    ...

火云
32分钟前
0
0
十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
42分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
今天
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部