ssh项目-hibernate注解-自动建表时有注释

最近在项目中,有小组成员提出数据库的表及字段没有注释的问题。通过自己在网上和查看源码,解决创建表时,注释的添加。

字段的注释,本方法只适用于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方法略了
	 */
}

数据效果图

ssh项目-hibernate注解-自动建表时有注释_第1张图片 表信息 ssh项目-hibernate注解-自动建表时有注释_第2张图片 建表sql ssh项目-hibernate注解-自动建表时有注释_第3张图片 测试表的字段信息

已经有的表,只能通过sql进行操作了。这种工作,后期有时间在设计和构思吧。先这样吧。

PS:该工作了,不然老板要打我了。( ^_^ )/~~拜拜

 

你可能感兴趣的:(项目)