在hibernate中,我得到的数据太大了。那就是-
由: com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1527):数据截断:数据太长以致于第1行的列“FBZipLoc”在com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1065) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195) .
是否可能自动截断所有字段的数据。或者其他处理这个问题的方法。但是我不想检查所有字段的数据长度,因为我有超过1000个字段。
发布于 2011-07-30 10:10:02
据我所知,Hibernate或MySQL实际上不可能在不添加处理此操作的逻辑的情况下自动截断字符串。我之所以相信这样的东西是不存在的,是因为我从来不想让我要求插入到数据库中的内容与实际插入的内容有所不同。
我认为你唯一的选择是..。
更新,因为您不能真正更新数据库,所以我推荐一个方面来拦截字符串集并检查它们的长度--它看起来可能是这样的(语法可能关闭,而我没有测试这个).
private static final MAX_SIZE_OF_STRINGS = 255;
@Around("execution(* your.package.*.set*(..)) && args(java.lang.String)")
public void checkAroundSetter(final ProceedingJoinPoint pjp)
throws Throwable {
Object[] args = pjp.getArgs();
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof String && ((String) args[i]).size() > MAX_SIZE_OF_STRINGS) {
args[i] = ((String)args[i]).subString(0,MAX_SIZE_OF_STRINGS) ;
}
}
pjp.proceed(args);
}此外,如果某个层必须检查定义的列大小与每次插入的表中的所有数据相对应,则会有一些额外的开销。
发布于 2011-07-30 17:00:46
为此您可以使用Hibernate拦截器。它将允许您在保存对象之前更改对象状态。您可以根据保存的特定列或特定类型轻松地调整字符串。
发布于 2013-05-29 19:06:02
如果您真正想要的话,可以将MySQL配置为截断数据:
如果未启用严格SQL模式,并且将值分配给超过该列最大长度的CHAR或VARCHAR列,则会截断该值以使其适合,并生成警告。对于非空格字符的截断,可以使用严格的SQL模式导致错误(而不是警告)并抑制值的插入。见5.1.7节,“服务器SQL模式”。
但是,对于生产数据库来说,这是不可取的。
https://stackoverflow.com/questions/6882009
复制相似问题