java - JPA - 尝试保留日期字段时出现 "java.sql.SQLException: Data truncated"

标签 java mysql jpa

我正在将 NetBeans IDE 与 Glassfish 服务器结合使用,使用 JPA 制作 Web 服务。我的 MySQL 数据库有一个名为 enlistedYEAR 字段,它在 Java 代码中由 Date 表示。

enlisted 定义如下:

@Basic(optional = false)
@NotNull
@Column(name = "enlisted")
@Temporal(TemporalType.DATE)
private Date enlisted;

我的网络服务方法是:

@WebMethod(operationName = "addGroup")
    public StudGroup addGroup (
            @WebParam(name = "cd") String cd,
            @WebParam(name = "enlisted") String enlisted) throws ParseException {

        StudGroup group = new StudGroup();

        SimpleDateFormat df = new SimpleDateFormat("yyyy");
        Date date = df.parse(enlisted);

        group.setCd(cd);
        group.setEnlisted(date);
        em.persist(group);
        return group;
    }

当我尝试测试此方法时,我在 Glassfish 日志上看到此异常:

Warning:   Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Data truncated for column 'enlisted' at row 1
Error Code: 1265
Call: INSERT INTO stud_group (cd, enlisted) VALUES (?, ?)
    bind => [2 parameters bound]
Query: InsertObjectQuery(courses.StudGroup[ id=null ])
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:900)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:962)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:631)
...

正如我已经提到的,在 MySQL 中,enlisted 被定义为 YEAR。我认为这可能会导致这种行为,但是当我尝试检索数据时,一切正常。例如:

@WebMethod(operationName = "getGroup")
    public GroupsList getGroup(@WebParam(name = "groupCd") String groupCd, @WebParam(name = "enlisted") String enlisted) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("yyyy");
        Date date = df.parse(enlisted);
        List<StudGroup> list = em.createNamedQuery("StudGroup.findByCdAndEnlisted").setParameter("cd", groupCd).setParameter("enlisted", date).getResultList();
        return new GroupsList(list);

此代码按预期工作。 我也尝试过将其格式化为“yyyy-MM-dd”,但仍然没有效果。 搜索过类似的问题,但大多数都是由于真实的 SQL 数据截断或错误的 ENUM 声明而发生的。我认为日期字段已按其应有的方式声明,并且这些问题都没有帮助,所以我猜它不重复。

如何修复它?我现在不知道该去哪里寻找。感谢您的帮助。

最佳答案

所以,在 Basil Bourque 的帮助下我实际上已经解决了这个问题。根据this doc,提到这一点是正确的。 YEAR 实际上并不是 SQL 标准类型,并且由 EclipseLink 提供的 JPA 只能与纯 SQL 标准一起使用。算起来,YEAR 是依赖于 MySQL 的类型,所以我刚刚将其更改为 DATE - 它终于起作用了。

虽然我没有尝试过,但也有可能创建 Native Query本来可以帮助解决这个问题,但这是一个令人反感的决定,因为 JPA 被设计为独立于数据库(如果我们谈论的是 SQL 标准数据库)。

关于java - JPA - 尝试保留日期字段时出现 "java.sql.SQLException: Data truncated",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30017055/

相关文章:

java - 使用 Java IO 读取文件时返回 "impossible"null

java - 如何在 Java 中将分数格式的字符串转换为小数或 float ?

php - 使用 PDO 根据 mySQL 中其他两个表的结果从表中选择行

php - 如何从 MySQL 获取并组合数据,然后插入到 PHP 数组中

jpa - EntityManager 查询后不刷新数据

oracle - Oracle 和 Hibernate 中的 generatedValue 不起作用

java - 用简单的java蒙特卡罗模拟Pi?

java - 有没有办法将不断变化的数组重复传递给 Java Canvas 并让它更新屏幕?

PHP/Mysql x y 坐标之间的半径搜索

java - 如何定义 Postgres 9.0 的锁等待时间?