我正在使用MySQL DB处理遗留应用程序。
以下是相关表格:
RESERVATION
============
id: int
creation_date: tinyblob
...other stuff...
创建实体时,使用Java的creation_date
计算LocalDate.now()
。
当我从表中选择数据时(在MySQL Workbench中),我在creation_date列中只看到“BLOB
”。当我点击“在编辑器中打开值”时,我会得到类似的内容:
’ sr
java.time.Ser]º"H² xpw àx
当我双击该字段时,没有任何反应,它不会让我进入编辑模式。
有没有办法直接编辑这样存储的日期?我可以创建一个Java函数来插入除LocalDate.now()
以外的一些日期,但是在Workbench(或其他一些应用程序)中手动执行此操作会更容易。由于这是一个遗留软件,我无法改变列类型。
TNX。
答案 0 :(得分:0)
这是解决方案。这个人帮助了我:https://stackoverflow.com/a/8504540/1177067 创建一个扩展AttributeConverter的新类:
import java.time.LocalDateTime;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Object> {
@Override
public Object convertToDatabaseColumn(LocalDateTime locDateTime) {
return locDateTime == null ? null : Timestamp.valueOf(locDateTime);
}
@Override
public LocalDateTime convertToEntityAttribute(Object sqlTimestamp) {
if (sqlTimestamp != null) {
try {
byte[] dbBytes = (byte[]) sqlTimestamp;
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(dbBytes));
LocalDateTime covertedDateFromBytes = (LocalDateTime) ois.readObject();
ois.close();
return covertedDateFromBytes;
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}
return null;
}
}
请注意:
@Override
public Object convertToDatabaseColumn(LocalDateTime locDateTime) {
return locDateTime == null ? null : Timestamp.valueOf(locDateTime);
}
正在以一种新的方式(例如时间戳记)存储日期,因此请确定您是想进一步使用tinyblob还是将新方法与时间戳记一起使用。