我正在使用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)
时捕捉异常会很明显。
答案 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