【问题标题】:Wrong date value inserted into database错误的日期值插入数据库
【发布时间】:2016-12-25 08:17:47
【问题描述】:

数据库是 Oracle 11g2 Express,默认架构为 hr。

类模型代码:

@Entity
@Table(name = "HR.EMPLOYEES")
public class User {

    private int id;
    private String username;
    private String firstname;
    private String lastname;
    private String email;
    private Date hireDate; // java.util.Date
    private String job_id;

    @Id
    @SequenceGenerator(name="EMPLOYEES_SEQ", sequenceName="EMPLOYEES_SEQ", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMPLOYEES_SEQ")
    @Column(name = "EMPLOYEE_ID")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Formula(value="FIRST_NAME || ' ' || LAST_NAME")
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Column(name = "FIRST_NAME")
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    @Column(name = "LAST_NAME")
    public String getLastname() {
        return lastname;
    }
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Column(name="HIRE_DATE")
    public Date getHireDate() {
        return hireDate;
    }
    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }
    @Column(name="JOB_ID")
    public String getJob_id() {
        return job_id;
    }
    public void setJob_id(String job_id) {
        this.job_id = job_id;
    }

}

类模型的实现:

public class UserDAOImpl implements UserDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public UserDAOImpl() {

    }

    public UserDAOImpl(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @Transactional
    public List<User> list() {        
        @SuppressWarnings("unchecked")
        List<User> listUser = (List<User>) sessionFactory.getCurrentSession()
        .createCriteria(User.class)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
        return listUser;
    }

    @Override
    @Transactional
    public User get(int id) {

        String hql = "from User where id=" + id;
        Query query = sessionFactory.getCurrentSession().createQuery(hql);

        @SuppressWarnings("unchecked")
        List<User> listUser = (List<User>) query.list();

        if (listUser != null && !listUser.isEmpty()) {
            return listUser.get(0);
        }

        return null;

    }

    @Override
    @Transactional
    public void saveOrUpdate(User user) {
        sessionFactory.getCurrentSession().saveOrUpdate(user);
    }

    @Override
    @Transactional
    public void delete(int id) {
        User userToDelete = new User();
        userToDelete.setId(id);
        sessionFactory.getCurrentSession().delete(userToDelete);
    }

}

JSP 页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${titre}</title>
<style type="text/css">
    a {
        text-decoration: none;
    }
</style>
</head>
<body>
    <div align="center">
        <h1>${titre}</h1>
        <table>
            <form:form action="save" method="post" modelAttribute="user">
            <form:hidden path="id"/>
            <tr>
                <td>Firstname:</td>
                <td><form:input path="firstname"/></td>
            </tr>
            <tr>
                <td>Lastname:</td>
                <td><form:input path="lastname"/></td>
            </tr>
            <tr>
                <td>Email:</td>
                <td><form:input path="email"/></td>
            </tr>
            <tr>
                <td>Hiredate:</td>
                <td><form:input path="hireDate"/></td>
            </tr>
            <tr>
                <td>Job_id:</td>
                <td><form:input path="job_id"/></td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="Save">
                </td>
                <td><a href="<c:url value='/' />"><input type="button" value="Annuler" /></a></td>
            </tr>        
            </form:form>
        </table>
    </div>

</body>
</html>

当点击 JSP 页面中的提交按钮时,数据被插入到表中。但是日期栏从 18/08/16 更改为 08/06/17 !那么有什么问题呢?

【问题讨论】:

  • 我敢打赌,你的系统中有不同的时区。
  • 在哪里将字符串转换为日期?
  • 注意:不要使用Date 表示“本地日期”:Date 是一个瞬间,距离1970-1-1 00:00:00 UTC 的毫秒数;本地日期只是YYYY-mm-dd。例如:如果一个孩子于 8 月 18 日午夜在伦敦出生,其出生日期为 YYYY/08/18;但是在纽约市同一时刻出生的孩子的出生日期为 YYYY/08/17。你不能用瞬间来表示“日期”。
  • 那么使用哪种 java 数据类型最适合表示本地日期?
  • @pheromix LocalDate.

标签: java oracle hibernate spring-mvc oracle11gr2


【解决方案1】:

在通过 HTML 表单访问数据库时,日期总是很难使用。 在 JDBC 中,您应该尽可能使用 java.util.Date 对象并检查数据库上的区域设置是否与服务器上的区域设置相同(从字符串转换为日期,反之亦然)以及配置的时区也是一样的。

我不认为使用 LocalDate 会帮助您进行数据库记录,因为我不确定数据库驱动程序(或数据库 fromework - 当您使用 JPA 时,您应该使用 Hibernate 或类似的东西)是否会支持它。

有时,使用字符串来表示生日更简单...

此外,在您的代码中,您没有向我们展示您将字符串从输入表单转换为日期的位置,也许问题出在此处...

问候,

洛伊克

【讨论】:

    【解决方案2】:

    尝试在@Entity 类中为您的日期变量设置@DateTimeFormat(pattern="dd.MM.yyyy")(使用适合您的模式)。

    例如。

    @DateTimeFormat(pattern="dd.MM.yyyy")
    @Column(name = "auctionDate")
    private LocalDate auctionDate;
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2011-08-27
      • 2012-12-23
      • 2014-12-13
      • 1970-01-01
      • 2013-07-28
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多