提前检测字符串超长

时间:2014-11-27 15:27:01

标签: java hibernate

我正在使用Hibernate来保存从文件输入解码的数据。由于我们的格式之一是可变长度格式,因此我想在提交事务之前轻松检查实体中是否存在插入错误,因此我可以处理异常并采取适当的操作。 / p>

如果我有实体

@Entity
public class Entity {

    @Column(...,length=20)
    private String col1;

    @Column(...,length=20)
    private String col2;

    @Column(...,length=40)
    private String col3;

    ...

    @Column(...,length=100)
    private String col..N;

}

我想检测我设置为每列的值String是否与其长度兼容,可能没有检测Java代码来验证每个字段的最大长度。

目前,当只有一个记录受到问题影响时,我只会在提交事务时(即@Transactional方法返回)获得整个批处理时的SQL异常。在我Session.persist(entity)时捕捉异常会很明显。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

由于您已经使用了Hibernate,您是否考虑过Hibernate Validator?它看起来像这样

@Size(max = 20)
@Column(...,length=20)
private String col1;

// and validation itself
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
Set<ConstraintViolation<Entity>> constraintViolations = validator.validate(entity);

缺点是您必须在@Column旁边使用另一组注释,但另一方面它提供了更多选项。

另一种选择是使用aspects并拦截使用String注释的类的@Entity字段的每个setter。在这方面,您将获得@Column注释,并将参数长度与注释中已配置的lenght属性进行比较。

答案 1 :(得分:0)

您可以使用自定义拦截器修剪字符串,如下所示: Properly handling long data in Hibernate

或者可能使用长度注释和自定义长度验证器,如下所示: hibernate validator LengthValidator of truncated string