我正在将 NetBeans IDE 与 Glassfish 服务器结合使用,使用 JPA 制作 Web 服务。我的 MySQL 数据库有一个名为 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
声明而发生的。我认为日期字段已按其应有的方式声明,并且这些问题都没有帮助,所以我猜它不重复。
如何修复它?我现在不知道该去哪里寻找。感谢您的帮助。
最佳答案
所以,在 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/