Spring Data JPA自动创建表同时生成表和列的注释

创建表格时同时带上注释

一般情况下我们使用注解的方式很方便的就可以通过java类生成数据库的表,然后把注释写在字段上,就像下面一样


import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Table;

/**
 * demo例子
 * <p>
 * 2018/9/18
 *
 * @author Keith
 * @version v0.0.1
 */
@Entity
@Table(name = "tb_sample")
@Data
public class Sample {

    /**
     * 内容字段
     */
    private String content;

}

乍看,觉得已经很明白了,后面维护的人也能看明白。但如对于维护数据库的人来说可能就不是那么容易了,因为他们从数据库里看到的是下面的语句

CREATE TABLE `tb_sample` (
  `content` varchar(255) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8;

确实,这样看起来不怎么友好,为了解决这个问题,我们可以利用org.hibernate.annotations.Table注解和javax.persistence.Column 给表和列添加注释,更改之后如下所示:

import lombok.Data;
import org.hibernate.annotations.Table;


import javax.persistence.Column;
import javax.persistence.Entity;

/**
 * demo例子
 * <p>
 * 2018/9/18
 *
 * @author Keith
 * @version v0.0.1
 */
@Entity(name = "tb_sample")
@Table(appliesTo = "tb_sample",comment = "demo例子")
@Data
public class Sample {

    @Column(columnDefinition = "varchar(255) COMMENT '测试字段'")
    private String content;

}

这样自动创建的表格在数据库里就会是下面的样子:

CREATE TABLE `tb_sample` (
  `content` varchar(255) DEFAULT NULL COMMENT '测试字段'
) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8 COMMENT='demo例子';

这样,不仅java开发能方便的知道实体和每个字段的意思,维护数据库的人也没有压力,是不是挺方便的

注意事项

使用上面的方式,虽然挺方便,但需要注意以下三点:

  • 1.数据库是mysql
  • 2.需要配合Entity注解name属性一起使用,用上面的例子说明
    @Entity(name = "tb_sample")
    @Table(appliesTo = "tb_sample",comment = "demo例子")
    public class Sample {
    

    这里Entity的name的值要和Table的appliesTo的值一样。 一般情况下,我们没有给Entity的name赋值,默认就是实体的名称(这里是Sample), 如果你不指定Entity的name,那么Table的appliesTo的值为Sample,即数据库表名也为Sample

  • 3.实体的别名不再默认是类名,而是name的值 这就意味着Repository里本来是可以写类名的(因为默认是Sample)而要写成tb_sample(如下面代码),否则语句会解析错误,报找不到Sample这个实体
    @Modifying
    @Query("delete from tb_sample d where d.content=:content")
    int deleteByContent(@Param("content") String content);
    

Reference:

  • https://segmentfault.com/a/1190000015047290
  • https://blog.csdn.net/xiaxia_jessica/article/details/43274735