Java - Springboot中hibernate之自动创建表

步骤

1.先在maven配置中引入对应的jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

因为spring-boot-starter-data-jpa中已经包含了Hibernate所需要的相关依赖,所以只需要引入Jpa的依赖即可
2.配置application.properties文件

server.port=80
 
# Hibernate 相关配置
 
## 方言
#hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
## 显示Sql
hibernate.show_sql=true
## 自动建表方式
#hibernate.hbm2ddl.auto= update
## 自动扫描的包前缀
entitymanager.packagesToScan= com.zslin
 
## 数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/study05?\
  useUnicode=true&characterEncoding=utf-8&useSSL=true&autoReconnect=true
 
## 用户名
spring.datasource.username=root
 
## 密码
spring.datasource.password=123
 
## 数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 
## 建表方式
spring.jpa.properties.hibernate.hbm2ddl.auto=update
 
# 方言
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

说明:
spring.jpa.properties.hibernate.hbm2ddl.auto有几种配置:

  • create:每次加载Hibernate时都会删除上一次生成的表,然后重新生成新表,即使两次没有任何修改也会这样执行,这就导致每次启动都是一个新的数据库,也是导致数据丢失的重要原因
  • create-drop:每次加载Hibernate时都会生成表,但当SessionFactory关闭时,所生成的表将自动删除。
  • update:最常用的属性值,第一次加载Hibernate时创建数据表(前提是需要先有数据库),以后加载HIbernate时只会根据model更新,即使model已经删除了某些属性,数据表也不会随之删除字段。
  • validate:每次加载Hibernate时都会验证数据表结构,只会和已经存在的数据表进行比较,根据model修改表结构,但不会创建新表。

声明实体
@Entity
对实体注释。任何Hibernate映射对象都要有这个注释
@Entity定义对象将会成为被JPA管理的实体,将映射到指定的数据库表

@Table
声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的,如果没有则系统使用默认值(实体的短类名)

@Version
该注释可用于在实体Bean中添加乐观锁支持

声明主键
@Id
声明此属性为主键。该属性值可以通过自身创建,但是Hibernate推荐通过Hibernate生成
@Id定义属性为数据库的主键,一个实体里面必须有一

@IdClass
@IdClass利用外部类的联合主键

public @interface IdClass {
    Class value();
}

作为符合主键类,要满足以下几点要求。
必须实现Serializable接口。
必须有默认的public无参数的构造方法。
必须覆盖equals和hashCode方法。equals方法用于判断两个对 象是否相同,EntityManger通过find方法来查找Entity时是根 据equals的返回值来判断的。在本例中,只有对象的name和 email值完全相同或同一个对象时才返回true,否则返回 false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。

@GeneratedValue
指定主键的生成策略。有如下四个值:

  • TABLE:使用表保存id值
  • IDENTITY:identitycolumn
  • SEQUENCR :sequence
  • AUTO:根据数据库的不同使用上面三个

声明普通属性
@Column
声明该属性与数据库字段的映射关系。
注意:

  • 当POJO有属性不需要映射的时候一定要用@Transitent修饰,该注释表示此属性与表没有映射关系,只是一个暂时的属性。
  • @Lob注释表示该属性持久化为Blob或者Clob类型,具体取决于属性的类型。
    共有10个属性,这10个属性均为可选属性:
    name属性定义了被标注字段在数据库表中所对应字段的名称;
    unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
    nullable属性表示该字段是否可以为null值,默认为true。如果属性里使用了验证类里的@NotNull注释,这个属性可以不写。
    insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
    updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
    columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。若不指定该属性,通常使用默认的类型建表,若此时需要自定义建表的类型时,可在该属性中设置。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
    table属性定义了包含当前字段的表名。
    length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
    precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

@Basic : 表示该属性是表字段的映射。 如果实体的字段上没有任何注解默认就是@Basic

@Enumerated 直接映射枚举类型的字段

@UpdateTimestamp - 更新时自动更新时间
@CreationTimestamp - 创建时自动更新时间

声明关联关系
一对多关联关系
@OneToMany(mappedBy=” person”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)

一对多声明
@ManyToOne(cascade=CascadeType.REFRESH)

@JoinColumn
多对一声明 ,声明为双向关联

一对一关联关系
@OneToOne(optional= true,cascade =CascadeType.ALL, mappedBy = “person”)

一对一关联声明
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
声明为双向关联
多对多关联关系
@ManyToMany(mappedBy= “students”)
多对多关联声明
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = “Teacher_Student”,
joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName =“teacherid”)},
inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =“studentid”)})

#######################################################
SpringDataJPA中有个注解@Audited
只需在Entity中加上注解@Audited,就会自动帮你记录下Entity对应的表的所有操作记录insert,update,delete,会在数据库帮你生成一张表xxx_AUD;
这是在SpringDataJPA框架才能使用的一个注解

posted @ 2021-06-30 00:15  依梦维马  阅读(1968)  评论(0)    收藏  举报