最近在项目中,有小组成员提出数据库的表及字段没有注释的问题。通过自己在网上和查看源码,解决创建表时,注释的添加。
字段的注释,本方法只适用于MySQL数据库,其他的数据库根据数据库sql自行修改。
第一个查到的资料,说实话本来不抱希望的,在看到这个有点信心:
hibernate注解(自动建表如何有表DDL注释) -- Comment用法
在项目中,有用到hibernate Annotation 注解 。但是在自动建表,或者字段的时候,没有相关字段或者表注解
无法知道一个表中的字段 真正用途.这在项目中是非常蛋疼的!查了相关例子
表注解代码为(在网上也有相关例子)
@org.hibernate.annotations.Table(appliesTo = "TableName",comment="表注释")
/**
* int类型
*/
@Column(name="age",columnDefinition="int(3) COMMENT '病人年龄 '")
private int age;
/**
* 时间类型
*/
@Column(name="created",columnDefinition="DATETIME COMMENT '生成时间'")
private Date created;
/**
* double
*/
@Column(name="price",columnDefinition = "Decimal(10,2) COMMENT '床位单价'", scale = 2 ,precision=10)
/**
* text 文本类型限制
*/
@Column(name="C_Introduction", columnDefinition="TEXT")
private String introduction;
第二个找到的资料,是三个数据库的添加注释的sql,其他暂时没有去专门找:
Oracle、Mysql、SqlServer创建表和给表和字段加注释
--一、Oracle
--创建表
create table test (
id varchar2(200) primary key not null,
sort number,
name varchar(200)
)
--字段加注释
comment on column test.id is 'id';
comment on column test.sort is '序号';
--表加注释
comment on table test is '测试表'
--二.Mysql
--创建表
create table test (
id varchar(200) not null,
sort int(11) comment '排序',
name varchar(200) comment '名称',
)
--表加注释
alter table test comment ='测试表'
--三.SqlServer
--创建表
create table test (
id varchar(200) primary key not null,
sort int,
name varchar(200),
)
--给字段加注释
EXEC sp_addextendedproperty N'test', N'序号', N'user', N'dbo', N'table', N'test', N'column', N'sort';
--表加注释
EXECUTE sp_addextendedproperty N'test', N'测试表', N'user', N'dbo',N'table', N'test', NULL, NULL
根据上面的信息,就去项目中找相关的jar包,看看是不是支持相应的注解。下面都是测试类里面 用到的注解,其他的就没有全部弄出来,太多了。
hibernate-jpa-2.0-api-1.0.0.Final.jar
Column注解
package javax.persistence;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column
{
public abstract String name();
public abstract boolean unique();
public abstract boolean nullable();
public abstract boolean insertable();
public abstract boolean updatable();
public abstract String columnDefinition();
public abstract String table();
public abstract int length();
public abstract int precision();
public abstract int scale();
}
Entity注解
package javax.persistence;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity
{
public abstract String name();
}
GeneratedValue注解
package javax.persistence;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GeneratedValue
{
public abstract GenerationType strategy();
public abstract String generator();
}
id注解
package javax.persistence;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Id
{
}
hibernate3.jar
Cache注解
package org.hibernate.annotations;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Cache
{
public abstract CacheConcurrencyStrategy usage();
public abstract String region();
public abstract String include();
}
CacheConcurrencyStrategy枚举
package org.hibernate.annotations;
import org.hibernate.cache.access.AccessType;
public enum CacheConcurrencyStrategy
{
NONE(null),
READ_ONLY(AccessType.READ_ONLY),
NONSTRICT_READ_WRITE(AccessType.NONSTRICT_READ_WRITE),
READ_WRITE(AccessType.READ_WRITE),
TRANSACTIONAL(AccessType.TRANSACTIONAL);
private final AccessType accessType;
private CacheConcurrencyStrategy(AccessType accessType) {
this.accessType = accessType;
}
public static CacheConcurrencyStrategy fromAccessType(AccessType accessType) {
String name = accessType == null ? null : accessType.getName();
if (AccessType.READ_ONLY.getName().equals(name)) {
return READ_ONLY;
}
if (AccessType.READ_WRITE.getName().equals(name)) {
return READ_WRITE;
}
if (AccessType.NONSTRICT_READ_WRITE.getName().equals(name)) {
return NONSTRICT_READ_WRITE;
}
if (AccessType.TRANSACTIONAL.getName().equals(name)) {
return TRANSACTIONAL;
}
return NONE;
}
public static CacheConcurrencyStrategy parse(String name)
{
if (READ_ONLY.accessType.getName().equalsIgnoreCase(name)) {
return READ_ONLY;
}
if (READ_WRITE.accessType.getName().equalsIgnoreCase(name)) {
return READ_WRITE;
}
if (NONSTRICT_READ_WRITE.accessType.getName().equalsIgnoreCase(name)) {
return NONSTRICT_READ_WRITE;
}
if (TRANSACTIONAL.accessType.getName().equalsIgnoreCase(name)) {
return TRANSACTIONAL;
}
if ("none".equalsIgnoreCase(name)) {
return NONE;
}
return null;
}
public AccessType toAccessType()
{
return this.accessType;
}
}
GenericGenerator注解
package org.hibernate.annotations;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GenericGenerator
{
public abstract String name();
public abstract String strategy();
public abstract Parameter[] parameters();
}
已经创建的表,对应的实体类上使用本注解,运行数据库对应表没有变化。这里就不贴出来了
@org.hibernate.annotations.Table(appliesTo = "TableName",comment="表注释")
新建表,对应的实体类上使用注解,添加注释,数据库新表添加了注释。
测试类
package com.…….pojo;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
/**
* @author WinSonZhao(……)
* @version v1.0
* @Date 2018年8月27日 下午4:04:15
* @Create eclipse Mars.2 Release (4.5.2)
*/
@Entity
@Table(name="td_test")
@org.hibernate.annotations.Table(appliesTo = "td_test",comment="测试标注释……")
@Cache(usage= CacheConcurrencyStrategy.READ_WRITE)
public class TdTest implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy="uuid")
@Column(name="id",columnDefinition="varchar(32) COMMENT '主键'")
private String id;// id
@Column(name="status",columnDefinition="int(3) COMMENT '状态'")
private Integer status;//状态
@Column(name="createname",columnDefinition="varchar(10) COMMENT '创建人'")
private String createname;// 姓名
@Column(name="createDate",columnDefinition="DATETIME COMMENT '创建日期'")
private Date createDate;//创建日期
@Column(name="updatename",columnDefinition="varchar(10) COMMENT '修改人'")
private String updatename;// 姓名
@Column(name="updateDate",columnDefinition="DATETIME COMMENT '修改日期'")
private Date updateDate;//创建日期
@Column(name="remarks",columnDefinition="varchar(100) COMMENT '说明'")
private String remarks;// 说明
/**
* set和get方法略了
*/
}
数据效果图
表信息 建表sql 测试表的字段信息已经有的表,只能通过sql进行操作了。这种工作,后期有时间在设计和构思吧。先这样吧。
PS:该工作了,不然老板要打我了。( ^_^ )/~~拜拜