繁体   English   中英

JPA-尝试保留Date字段时“ java.sql.SQLException:数据被截断”

[英]JPA - “java.sql.SQLException: Data truncated” when trying to persist Date field

我将NetBeans IDE与Glassfish服务器一起使用,并使用JPA进行网络服务。 我的MySQL DB具有名为enlisted YEAR字段,该字段由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声明而发生的。 我认为应将Date字段声明为应有的字段,并且所有这些问题都没有帮助,因此我想它不是重复的。

我如何解决它? 我不知道现在要去哪里找。 谢谢你的帮助。

因此,在Basil Bourque的帮助下,我实际上已经解决了这个问题。 值得一提的是,根据该文档, YEAR实际上不是SQL标准的类型,并且,正如EclipseLink提供的JPA一样,它仅适用于纯SQL标准。 除此之外, YEAR是MySQL依赖的类型,因此我将其更改为DATE终于可以了。

尽管我还没有尝试过,但是创建本机查询也可能有助于解决它,但这是令人不愉快的决定,因为JPA被设计为独立于数据库(如果我们谈论的是SQL标准数据库) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM