内容简介:Java for Web学习笔记(一零八):Spring框架中使用JPA(8)再谈Entity数据映射
timestamp或datetime的匹配
存放毫秒
在数据库中缺省的精度为秒,如果需要存放毫秒甚至更好,可以如下:
CREATE TABLE Ticket ( TicketId BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId BIGINT UNSIGNED NOT NULL, Subject VARCHAR(255) NOT NULL, Body TEXT, -- 精度为0.000001秒 DateCreated TIMESTAMP(6) NULL, CONSTRAINT Ticket_UserId FOREIGN KEY (UserId) REFERENCES UserPrincipal (UserId) ON DELETE CASCADE ) ENGINE = InnoDB; -- 精度为毫秒 `DateCreated` datetime(3) NULL DEFAULT NULL,
匹配为java.sql.Timestamp
这是可以直接匹配
private Timestamp dateCreated;
@Basic
public Timestamp getDateCreated() {
return dateCreated;
}
public void setDateCreated(Timestamp dateCreated) {
this.dateCreated = dateCreated;
}
但java.sql.Timestamp不是很好使用,一般我们可以将其转换为Instant
Instant instant = Instant.now(); entity.setDateCreated(new Timestamp(now().toEpochMilli()));
和LocalDateTime的转换
目前并不支持和LocalDateTime的直接转换,但是我们可以通过一些小技巧,让用起来,就如同直接转换那样。
@Entity
public class TestEntity implements Serializable{
private LocalDateTime createTime;
// 采用private,也就是数据库的列的匹配并不直接开发出来,对使用者隐藏。
@Basic
@Column(name="create_time")
private String getCreateTimeStr() {
return createTime== null ? null : createTime.toString();
}
// setter同样采用private,这里的转换某种意义上是不规范的,没有考虑ISO8601中时区Z等携带信息,正式代码中需要补齐,这里只是简单测试
@Basic
@Column(name="create_time")
private void setCreateTimeStr(String createTimeStr) {
try{
if(StringUtils.isBlank(createTimeStr))
this.createTime = null;
else
this.createTime = LocalDateTime.parse(createTimeStr.replace(' ', 'T'));
}catch(Exception e){
this.createTime = null;
}
}
@Transient
public LocalDateTime getCreateTime() {
return createTime;
}
@Transient
public void setCreateTime(LocalDateTime createTime) {
this.createTime= createTime;
}
......
}
采用Convert进行转换
前面的LocalDateTime的转换其实正规的应该使用Converter,下面以json存储的转换为对象为例子。假设是数据库的某一列使用text,存放的是json数据。我们可以用类似上面讲述的方式直接获取对象。
@Entity
public class TestPage implements Serializable{
private long id;
private String userName;
private String emailAddress;
private Address address; //将数据库中以json text存放的信息和对象直接管理
... ...
@Convert(converter=AddressConverter.class)
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public static class AddressConverter implements AttributeConverter<Address, String> {
private static final Gson gson = new Gson();
@Override
public String convertToDatabaseColumn(Address attribute) {
return gson.toJson(attribute);
}
@Override
public Address convertToEntityAttribute(String dbData) {
return gson.fromJson(dbData, Address.class);
}
}
}
关于gson
gson是json解析器,非常好使用。下面是其在pom.xml引入
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>
我们希望直接将"time":"2018-01-12T09:47:51.411"直接映射为LocalDateTime。同样这里的转换代码只是为了测试便利,没有考虑ISO8601中时区Z等携带信息,正式代码中需要补齐。
public static Gson createGson(){
return new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
return LocalDateTime.parse(json.getAsJsonPrimitive().getAsString());
}
}).registerTypeAdapter(LocalDateTime.class,new JsonSerializer<LocalDateTime>() {
@Override
public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
}).create();
}
相关链接: 我的Professional Java for Web Applications相关文章
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射
- RedBeanPHP 5.4 发布,PHP 的 ORM 映射框架
- RedBeanPHP 5.4 beta 1 发布,PHP 的 ORM 映射框架
- MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射
- MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射
- Hibernate 关系映射整理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ES6 标准入门(第2版)
阮一峰 / 电子工业出版社 / 2016-1 / 69.00元
ES6(又名 ES2105)是 JavaScript 语言的新标准,2015 年 6 月正式发布后,得到了迅速推广,是目前业界超级活跃的计算机语言。《ES6标准入门(第2版)》是国内仅有的一本 ES6 教程,在前版基础上增补了大量内容——对标准进行了彻底的解读,所有新增的语法知识(包括即将发布的 ES7)都给予了详细介绍,并且紧扣业界开发实践,给出了大量简洁易懂、可以即学即用的示例代码。 《......一起来看看 《ES6 标准入门(第2版)》 这本书的介绍吧!