【问题标题】:Exception with using Hibernate使用 Hibernate 的异常
【发布时间】:2015-02-24 12:43:10
【问题描述】:

请帮帮我。

在插入表数据时崩溃,列 setCreateDate。谁知道这个错误是什么,为什么不可能写一个时间戳DateTime对象????

Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for integer: "2015-02-24 13:48:32.575000 +02:00:00"
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
    ... 56 more

类道:

import com.tatem.persistance.dao.core.GenericDao;
import com.tatem.persistance.domain.core.DomainObject;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import java.io.Serializable;
import java.util.List;
public class GenericDaoHibernate<T extends DomainObject> implements GenericDao<T> {

private Class<T> type;
@Autowired
private HibernateTemplate hibernateTemplate;

@Autowired
private SessionFactory sessionFactory;

public GenericDaoHibernate(Class<T> type) {
    this.type = type;
}


@Override
public T get(Serializable id) {
    return hibernateTemplate.get(type, id);
}

@Override
public List<T> getAll() {
    return hibernateTemplate.loadAll(type);
}

@Override
public Serializable save(T object) {
    Serializable id = (Serializable) hibernateTemplate.save(object);
    hibernateTemplate.flush();
    return id;
}

@Override
public void saveBulk(List<T> objects){
    hibernateTemplate.saveOrUpdateAll(objects);
    hibernateTemplate.flush();
}

public HibernateTemplate getHibernateTemplate() {
    return hibernateTemplate;
}

@Override
public void merge(T object) {
    hibernateTemplate.merge(object);
    hibernateTemplate.flush();
}

@Override
public void update(T object){
    hibernateTemplate.update(object);
    hibernateTemplate.flush();
}

@Override
public void delete(T object) {
    hibernateTemplate.delete(object);
    hibernateTemplate.flush();
}

@Override
public void deleteAll(List<T> objects) {
    hibernateTemplate.deleteAll(objects);
    hibernateTemplate.flush();
}

@Override
public void bulkSaveOrUpdate(List<T> objects) {
    hibernateTemplate.saveOrUpdateAll(objects);
    hibernateTemplate.flush();
}
}

类休眠:

import com.tatem.bookingserver.rest.json.model.notification.InternalNotificationType;

import com.tatem.persistance.domain.core.DomainObject;

import org.hibernate.annotations.Type;

import org.joda.time.DateTime;

import javax.persistence.*;

@Entity
@Table(name = "internal_notification")
public class InternalNotificationEntity implements DomainObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "user_id")
private long userId;

@Column(name = "created_ts")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime createDate;

@Enumerated(EnumType.STRING)
private InternalNotificationType type;

@Column
private String message;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public DateTime getCreateDate() {
    return createDate;
}

public void setCreateDate(DateTime createDate) {
    this.createDate = createDate;
}

public InternalNotificationType getType() {
    return type;
}

public void setType(InternalNotificationType type) {
    this.type = type;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public long getUserId() {
    return userId;
}

public void setUserId(long userId) {
    this.userId = userId;
}

}

【问题讨论】:

  • 看起来您正在尝试将日期保存到 int 列中。
  • 检查您的数据库表,您尝试保存在时间戳中的列的类型似乎不正确。
  • 不知道 postgress,但是有时区的时间戳和没有时区的时间戳有区别吗?

标签: java spring hibernate exception


【解决方案1】:

您可能在createDate 映射上缺少@Temporal 注释。应该是这样的

@Temporal(TemporalType.TIMESTAMP) 
private Date createDate;

此映射需要timestamp 类型的数据库列(根据您的需要,它可以是date 或任何类似类型)。

【讨论】:

  • 感谢您的回复,但如果使用 java.util.Date 中的 Date,我考虑使用库 org.joda.time.DateTime 中的 DateTime 的代码。
  • 是的,Joda 的DateTime 可以与@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 一起使用,但我在您编辑的帖子中看到您已经弄清楚了。
【解决方案2】:

谢谢大家,正如@StanislavL 所写,转错类型,表列created_ts bigint NOT NULL DEFAULT fn_now_as_bigint()

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多