首先创建一个BaseModel,自动生成创建时间和更新时间

@SuppressWarnings("serial")
@MappedSuperclass
public class BaseModel implements Serializable{ @Temporal(TemporalType.TIMESTAMP)
@Column(insertable=false, updatable=false)
@CreationTimestamp
protected Date createTime; @JsonIgnore
@Temporal(TemporalType.TIMESTAMP)
@Column(insertable=false)
@UpdateTimestamp
protected Date lastUpdateTime; public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} public Date getLastUpdateTime() {
return lastUpdateTime;
} public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
} }

然后创建一个RandomIdModel,利用org.hibernate.id.UUIDHexGenerator生成的uuid作为主键

@SuppressWarnings("serial")
@MappedSuperclass
public class RandomIdModel extends BaseModel { @Id
@Column(length=32)
@GeneratedValue(generator="UUIDHexGenerator")
@GenericGenerator(name="UUIDHexGenerator", strategy="uuid")
protected String id; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} }

然后就可以创建其他的具体实体类继承上面的model了,这样就保证了所有的表都会有创建时间和更新时间了

@SuppressWarnings("serial")
@Entity
@Table(name="tb_user",
indexes={ @Index(name=User.UK_NAME, unique=true, columnList="name"),
@Index(name=User.UK_PHONE, unique=true, columnList="phone")})
public class User extends RandomIdModel{ public static final String UK_NAME = "uk_name";
public static final String UK_PHONE = "uk_phone"; @Column(length=24)
private String name; @Column(length=32)
private String password; @Temporal(TemporalType.TIMESTAMP)
private Date birth; @Enumerated(EnumType.STRING)
@Column(length=8)
private Sex sex; @Column(length=64)
private String email; @Column(length=11)
private String phone; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
} public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
} public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
} public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}

创建唯一索引时,自定义索引名,有利于后续业务判断。

当插入数据不唯一时,可根据抛出的异常,明确知道是哪个字段违反约束导致的

if(e.getCause() instanceof ConstraintViolationException){
String constraintName = ((ConstraintViolationException)e.getCause()).getConstraintName();
if(constraintName.equals(User.UK_NAME)){
return Resp.error(Resp.ErrorCode.USER_NAME_EXITS, null);
}
if(constraintName.equals(User.UK_PHONE)){
return Resp.error(Resp.ErrorCode.USER_PHONE_EXITS, null);
}
}

JPA注解实体类,给表添加创建时间,更新时间,id的生成以及创建唯一约束的更多相关文章

  1. MVC Code First 当实体类发生变化时,如何自动更新数据库表

    下面做一个例子,Category是用户新建的一个实体类,然后添加一个字段,然后让数据库中的Category表也添加一个字段 1.Category.cs

  2. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  3. [mysql]SQL语句-新增/修改 创建时间 更新时间

    SQL关键词 要注意大小写   已建表,之前没有创建时间列, 现新增1列创建时间,并设置默认值为当前时间 --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER T ...

  4. spring boot JPA中实体类常用注解

    spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...

  5. Hibernate jpa 在实体类中对于时间的注解

    在时间类型DATE 属性上添加一个 @Temporal(TemporalType.DATE)(精确到年月日)@Temporal(TemporalType.TIME)(精确到时分秒)@Temporal( ...

  6. Hibernate用注解实现实体类和表的映射

    数据库mysql: 1.一对一 person50表password50表是一对一的关系: password50表中有外键 person_id person实体类: package com.c50.en ...

  7. Hibernate注解实体类

    Hibernate注解1.@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2.@Table(name="",cat ...

  8. EntityFramework中实体类到表名的批量映射

    在使用EntityFramework做CodeFirst开发时,经常需要将实体类映射到数据库表,但是C#实体类和数据库表中的命名遵循的是不同的规范,这就需要为每个实体类做一个到数据库表名的映射.大多情 ...

  9. Mysql 添加 create_time, update_time 创建时间 更新时间 自动更新

    # 添加 创建 更新 时间字段 ALTER TABLE `表名` ADD COLUMN `create_time`  datetime NOT NULL DEFAULT CURRENT_TIMESTA ...

随机推荐

  1. linux cenots7安装mysql

        1.下载mysql 下载的话先确认好版本. system:centos7 mysql:5.7 下面的版本自己选择,一般是86位的. 下载好的文件 2.上传到服务器 soft文件夹,终端也进入了 ...

  2. 【微软大法好】VS Tools for AI全攻略

    大家都知道微软在Connect();17大会上发布了VS Tools for AI,旨在提升Visual Studio和VSCode对日益增长的深度学习需求的体验.看了一圈,网上似乎没有一个完整的中文 ...

  3. rsync 自动创建目录的坑点

    rsync同步文件有三种模式: 1.把源站路径下某个文件,同步到目标路径.例如rsync -aR /data/1/2/3/a.txt 1.1.1.1:/data/ ,目标机器将自动创建多层目录存放a. ...

  4. 4-51单片机WIFI学习(开发板51单片机自动冷启动下载原理)

    上一篇链接 http://www.cnblogs.com/yangfengwu/p/8743936.html 这一篇说一下自己板子的51单片机自动冷启动下载原理,我挥舞着键盘和鼠标,发誓要把世界写个明 ...

  5. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  6. LXC学习实践(2)安装LXC

    1.准备工作: yum install gcc yum install libcap-devel yum install libcgroup 2.安装LXC 下载源代码:sourceforge.net ...

  7. 九、Python+Selenium模拟用QQ登陆腾讯课堂,并提取报名课程(练习)

    研究QQ登录规则的话,得分析大量Javascript的加密解密,比较耗时间.自己也是练习很少,短时间成功不了.所以走了个捷径. Selenium是一个WEB自动化测试工具,它运行时会直接实例化出一个浏 ...

  8. 用js来实现那些数据结构(数组篇02)

    上一篇文章简单的介绍了一下js的类型,以及数组的增删方法.这一篇文章,我们一起来看看数组还有哪些用法,以及在实际工作中我们可以用这些方法来做些什么.由于其中有部分内容并不常用,所以我尽量缩小篇幅.在这 ...

  9. ZooKeeper:win7上安装单机及伪分布式安装

    zookeeper是一个为分布式应用所设计的分布式的.开源的调度服务,它主要用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用,协调及其管理的难度,提高性能的分布式服务. 本章的目的:如何 ...

  10. Object.prototype.toString.call(obj)使用方法以及原理

    这几天看vue-router的源码 发现了Object.prototype.toString.call()这样的用法,当时以为这就是转成字符串的用的,但是越看越觉得不太对劲,赶紧查查资料,一查才知道没 ...