Java for Web学习笔记(一零八):Spring框架中使用JPA(8)再谈Entity数据映射

栏目: Java · 发布时间: 6年前

内容简介: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相关文章

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spring Into HTML and CSS

Spring Into HTML and CSS

Molly E. Holzschlag / Addison-Wesley Professional / 2005-5-2 / USD 34.99

The fastest route to true HTML/CSS mastery! Need to build a web site? Or update one? Or just create some effective new web content? Maybe you just need to update your skills, do the job better. Welco......一起来看看 《Spring Into HTML and CSS》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具