【发布时间】:2011-11-30 14:05:25
【问题描述】:
我有一个网络应用程序,使用 EclipseLink 和 MySQL 来存储数据。 其中一些数据是字符串,即数据库中的 varchars。 在实体的代码中,字符串具有如下属性:
@Column(name = "MODEL", nullable = true, length = 256)
private String model;
该数据库不是eclipseLink从代码中创建的,但长度与数据库中的varchar长度匹配。 当此类字符串数据的长度大于长度属性时,调用 javax.persistence.EntityTransaction.commit() 时会引发异常:
javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'MODEL' at row 1
然后事务被回滚。 虽然我知道这是默认行为,但这不是我想要的。 我希望数据被静默截断,事务被提交。
我可以在不为相关实体的字符串数据的每个集合方法中添加对子字符串的调用的情况下执行此操作吗?
【问题讨论】:
-
我认为答案是“不,你不能”。
-
似乎没有人可以肯定地说出它作为答案。
-
作为一个极端的解决方案,您可以考虑使用 AOP 框架(例如 AspectJ)来拦截对 setter 的调用。这真的很棘手,所以我不建议将其作为解决方案。
-
如果 EclipseLink 可以配置为生成
INSERT IGNORE和UPDATE IGNORE语句,那么 MySQL 将截断这些操作。但要小心,ignore修饰符应该只设置在真正需要和控制截断的地方。截断很危险,可能导致漏洞。
标签: java jpa eclipselink