gpt4 book ai didi

java - 在 Hibernate 中正确处理长数据

转载 作者:IT王子 更新时间:2023-10-28 23:49:59 25 4
gpt4 key购买 nike

我在 hibernate 中遇到数据太大的问题。那就是-

Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column 'FBZipLoc' at row 1 at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1527) at 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) ... 12 more

是否可以自动截断所有字段的数据。或任何其他方式来处理这个问题。但我不想检查所有字段的数据长度,因为我有超过一千个字段。

最佳答案

据我所知,如果不添加处理逻辑,Hibernate 或 MySQL 确实无法自动截断字符串。我相信这样的东西不存在的原因是我永远不希望我要求插入数据库的内容与实际插入的内容不同。

我认为你唯一的选择是......

  1. 更改列定义。使其成为更大的 varchar 字段,甚至可以是文本字段。不要花时间构建一个神奇的工具,只要更改列定义就可以通过几次点击来解决这个问题。我建议这样做!

  2. 我可以看到您使用某种 aspect 来拦截 setter,然后在字符串大于 x 长度时调整其大小。这将是在您的代码中处理它的最快的原因。如果更改数据库不是一种选择,并且您有数千个字段,这将是我的下一个选择。

  3. 构建一个 String util 类,它可以重新调整字符串大小...

    setText(String val){this.text = StringUtil.truncate(val,size);}

[更新]由于您无法真正更新数据库,因此我建议使用一个方面来拦截字符串 setter 并检查它们的长度,它可能看起来像这样(语法可能已关闭,我没有对此进行测试)...

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);
}

此外,如果某个层必须根据每次插入时进入表的所有数据检查定义的列大小,则会产生一些额外的开销。

关于java - 在 Hibernate 中正确处理长数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6882009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com