首先创建一个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. 关于java中的数组

    前言:最近刚刚看完了<Java编程思想>中关于数组的一章,所有关于Java数组的知识,应该算是了解的差不多了.在此再梳理一遍,以便以后遇到模糊的知识,方便查阅. Java中持有对象的方式, ...

  2. 09-TypeScript中的继承

    在后端开发语言中,继承是非常重要的概念,继承可以让子类具有父类的成员和方法,通过实例化子类,就可以访问父类的成员和方法. 在JavaScript中,需要通过原型模式来模拟继承的实现.而在TypeScr ...

  3. windows 7 netsh wlan命令连接wifi

    显示本机保存的profiles,配置文件是以wifi的ssid命名的. netsh wlan show profiles 用netsh wlan connect name=00_1111 连接其中一个 ...

  4. H5新特性之webWorker

    众所周知javascript是单线程语言,这就是js开发难度较低的原因了,因为不需要解决多线程的资源共享问题(例如死锁),但是单线程性能并不好,因此多了一个webWorker实现js的多进程来提升js ...

  5. springmvc的ModelAttribute注解

    先看一个没有使用@ModelAttribute的Controller方法. @RequestMapping("/save") public String save(User use ...

  6. 访问器属性:setter()函数和getter()函数

    1.干嘛用的? getter()函数:返回有效的值 setter()函数:调用它并传入数据,这个函数决定如何处理数据 2.具备哪些属性?如何定义? configurable(默认为true),enum ...

  7. 如何从0开发一个Atom组件

    最近用Atom写博客比较多,然后发现一个很严重的问题..没有一个我想要的上传图片的方式,比如某乎上边就可以直接copy/paste文件,然后进行上传.然而在Atom上没有找到类似的插件,最接近的一个, ...

  8. Python面向对象进阶示例--自定义数据类型

    需求: 基于授权定制自己的列表类型,要求定制的自己的__init__方法, 定制自己的append:只能向列表加入字符串类型的值 定制显示列表中间那个值的属性(提示:property) 其余方法都使用 ...

  9. Spark:reduceByKey函数的用法

    reduceByKey函数API: def reduceByKey(partitioner: Partitioner, func: JFunction2[V, V, V]): JavaPairRDD[ ...

  10. Java:Linux上java -jar xxx.jar命令执行jar包时出现Error: Invalid or corrupt jarfile xxx.jar解决方案

    背景: 从ftp上上传jar包到linux上,之后在linux上通过ftp命令下载jar包文件,开始执行Java-jar,一直提示错误:Error: Invalid or corrupt jarfil ...