Kho*_*nde 10 java mysql hibernate
我在hibernate中遇到数据太大的问题.那是-
引起:java.sql.BatchUpdateException:数据截断:com.mysql.jdbc.PreparedStatement.executeBatch中com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1527)第1行第'FBZipLoc'列的数据太长(PreparedStatement.java:1065)org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)... 12更多
是否可以自动截断所有字段的数据.或任何其他方式来处理这个问题.但我不想检查所有字段的数据长度,因为我有超过一千个字段.
据我所知,如果不添加逻辑来处理这个问题,Hibernate 或 MySQL 确实无法自动截断字符串。我之所以相信这样的东西不存在,是因为我永远不希望我要求插入数据库的内容与实际插入的内容不同。
我认为你唯一的选择是......
更改列定义。 使其成为更大的 varchar 字段,甚至可能是文本字段。不要花时间构建一个神奇的工具,因为只需更改列定义就可以通过几次单击来解决此问题。我建议这样做!
我可以看到您使用某种方面来拦截设置器,然后在字符串大于 x 长度时调整字符串的大小。这将是在代码中处理它的最快原因。如果更改数据库不是一个选择,并且您有数千个字段,那么这将是我的下一个选择。
构建一个可以调整字符串大小的 String util 类...
setText(String val){this.text = StringUtil.truncate(val,size);}
[更新] 由于您无法真正更新数据库,我建议使用一个方面来拦截字符串设置器并检查它们的长度,它可能看起来像这样(语法可能关闭,我没有测试这个)...
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);
}
Run Code Online (Sandbox Code Playgroud)
此外,如果某个层必须根据每次插入时进入表的所有数据检查定义的列大小,则会产生一些额外的开销。