Hibernate的hbm2ddl.auto=update的内幕

2018-10-16  本文已影响0人  Seaofdesire

转载 https://blog.csdn.net/lmy86263/article/details/71304629

在使用Hibernate的时候我们一般都会配置hibernate.hbm2ddl.auto这个属性,而其中的常见的属性值包括:

一、实体变化

1、实体名称变化

实体名称变化,原来实体生成的表不删除,而是生成新的实体的表。

2、实体索引变化

索引的设置使用的是@Table中的indexes的属性,这个属性指的是@Index注解,其中常用的属性有:

columnList:指的是类中字段的名称;
unique:标识该索引是不是唯一;
当之前没有添加索引的时候,如果使用@Index添加索引时则会生成新的索引;如果之前设置了索引,之后在实体类中删除该索引,但是在数据库层次上并不会删除该索引;

二、字段变化

1、字段添加/删除

类中添加新的字段,则生成新的数据表列,而不删除或者影响其他的列;

类中删除一个字段,则该字段在数据库中生成的列不会删除,对应的数据库属性也不会受到影响;

2、字段改变

2.1名称改变

类中一个字段的名称变化,这相当于添加一个字段和删除一个字段,

新加的字段:生成新的数据库列,而不影响现有的数据库列;

2.2字段的属性改变

2.2.1 主键变化

在Hibernate中,使用JPA中的@javax.persistence.Id注解标识一个@Entity类的属性,这个@Id属性有以下几个特点:

在一个@Entity类必须有@Id标识的字段,可以多于一个,如果有多个则是生成复合主键,不是多个主键,例如在MySQL中生成符合主键时,实体类如下:

@Entity
public class User {
  @Id
  private Long id;
  @Id
  private long id0;
  @Column
  private String name;
}

生成的语句如下:

CREATE TABLE `user` (
`id0` bigint(20) NOT NULL,
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL
PRIMARY KEY (`id0`,`id`)
) 

该@Id注解只能被放在Java的基本类型以及其包装类型,比如int和Integer等;

如果在主键变化后,会产生不同的效果,在以下两种情况中:

之前有@Id注解的字段,后来没有@Id注解的字段:这中情况下会报出异常org.hibernate.AnnotationException: No identifier specified for entity;
但是不存在之前无@Id注解的字段,而之后可以存在的这种情况;

2.2.2 列属性变化

在Hibernate中如果想设置数据表列的属性时,使用的是@Column注解,在这个注解中的的常用的属性包括:

上一篇下一篇

猜你喜欢

热点阅读