我需要将当前日期和时间导入到格式为TimeStamp的MySQL数据库字段中。从检查样本数据来看,MySQL TimeStamp数据类型的格式似乎是“yyyy-mm-dd hh:mm:ss”。我在我的spring hibernate应用程序中使用Joda-Time格式化。如何以基础MySQL TimeStamp格式化字段接受的格式获取当前日期时间?
这是我当前的代码,由于eclipse说.parseDateTime()需要字符串参数而不是DateTime参数,因此无法编译:
public void setCreated(){
DateTime now = new org.joda.time.DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
created = fmt.parseDateTime(now);
System.out.println("'''''''''''''''''''''' created is: "+created);
}
我试图坚持的实体定义如下:
@Entity
@Table(name = "documents")
public class Document {
@Id
@GeneratedValue
@Column(name="id")
private Integer id;
@ManyToOne
@JoinColumn(name = "client_id")
private Patient patient;
@ManyToOne
@JoinColumn(name = "type_id")
private DocumentType type;
@Column(name="name")
private String name;
@Column(name="description")
private String description;
@Column(name="filename")
private String filename;
@Column(name="content")
@Lob
private Blob content;
@Column(name="content_type")
private String contentType;
@Column(name = "created")
private DateTime created;
public Integer getId(){return id;}
public void setId(Integer i){id=i;}
protected void setPatient(Patient patient) {this.patient = patient;}
public Patient getPatient(){return this.patient;}
public void setType(DocumentType type) {this.type = type;}
public DocumentType getType() {return this.type;}
public String getName(){return name;}
public void setName(String nm){name=nm;}
public String getDescription(){return description;}
public void setDescription(String desc){description=desc;}
public String getFileName(){return filename;}
public void setFileName(String fn){filename=fn;}
public Blob getContent(){return content;}
public void setContent(Blob ct){content=ct;}
public String getContentType(){return contentType;}
public void setContentType(String ctype){contentType=ctype;}
public void setCreated(){
DateTime now = new org.joda.time.DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
created = fmt.parseDateTime(now);
System.out.println("''''''''''''''''''''''''''' created is: "+created);
}
public DateTime getCreated() {return this.created;}
@Override
public String toString() {return this.getName();}
public boolean isNew() {return (this.id == null);}
}
如何更改上述内容以便以正确的格式保存数据以插入MySQL TimeStamp字段?
与Sotirios的建议相关,以下是我当前pom.xml的相关部分,供讨论之用:
<properties>
<jodatime-hibernate.version>1.3</jodatime-hibernate.version>
<jodatime-jsptags.version>1.1.1</jodatime-jsptags.version>
<jodatime.version>2.3</jodatime.version>
<jadira-usertype-core.version>3.1.0.CR8</jadira-usertype-core.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.core</artifactId>
<version>${jadira-usertype-core.version}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jodatime.version}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time-hibernate</artifactId>
<version>${jodatime-hibernate.version}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time-jsptags</artifactId>
<version>${jodatime-jsptags.version}</version>
</dependency>
</dependencies>
答案 0 :(得分:4)
因为你似乎需要它:
我的实体类
@Entity
@Table(name = "time_fields")
public class TimeFields {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long timeId;
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime dateTime;
使用适当的getter和setter。
客户端代码
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PersistenceContext.class);
SessionFactory sessionFactory = context.getBean(SessionFactory.class);
Session session = sessionFactory.openSession();
TimeFields timeFields = new TimeFields();
Date date = new Date();
DateTime dateTime = new DateTime();
System.out.println(date);
System.out.println(dateTime);
timeFields.setDate(date);
timeFields.setDateTime(dateTime);
session.beginTransaction();
session.persist(timeFields);
session.getTransaction().commit();
System.out.println(timeFields.getTimeId());
System.out.println(timeFields.getDate());
System.out.println(timeFields.getDateTime());
打印
Tue Dec 17 00:22:35 EST 2013
2013-12-17T00:22:35.843-05:00
3
Tue Dec 17 00:22:35 EST 2013
2013-12-17T00:22:35.843-05:00
除了joda-time和hibernate,你还需要jadira libs
<dependency>
<groupId>org.jadira.usertype</groupId>
<artifactId>usertype.jodatime</artifactId>
<version>2.0.1</version>
</dependency>
您应该阅读有关Hibernate UserType
s。
答案 1 :(得分:1)
日期的字符串表示纯粹供人类使用。时间戳在内部表示为与时区无关的数值。由于yyyy-mm-dd hh:mm:ss
不包含时区,因此尝试自行进行转换会让您遇到时区错误。
Hibernate将直接处理java.util.Date
或java.sql.Date
,因此您可以将数据类型更改为其中之一,然后执行映射到joda对象getter / setter所以它可以通过这种方式传递给调用者。
最好是IMO,你可以为Hibernate提供joda对象的映射。已经为此准备了一个图书馆:
https://github.com/JodaOrg/joda-time-hibernate
或通过maven:
http://mvnrepository.com/artifact/joda-time/joda-time-hibernate
注意:我个人的经验法则是,如果你看到代码操纵日期为字符串,它就会被破坏......不是任何科学指标,但我发现它远远好于50/50。 :)
编辑:文档在这里:http://www.joda.org/joda-time-hibernate/userguide.html
在类路径中使用它,您应该能够注释您的列,如:
@Column(name = "created")
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime created;