如何对相关Java String强制执行DB字段大小限制?

时间:2010-04-30 12:15:14

标签: java oracle mapping

防止尝试存储比VARCHAR2数据库字段中容纳的更多文本的正确方法是什么?

假设REGISTRATIONS表的PARTNER_ROLE字段声明为VARCHAR2(80)。

此字段在Java中的Registration类中映射为

public class Registration {
  @Column(name=”PARTNER_ROLE” length=”80”)
  private String partnerRole;
}

但是,setPartnerRole()方法允许用户填充任意长度的字符串。仅当随后尝试插入或更新REGISTRATIONS记录时才会遇到此问题。甲骨文抱怨道。

处理这种情况的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

解决方案1:在UI端本身设置文本字段或文本区域中的字段长度限制,该字段长度限制为PARTNER_ROLE输入。也可以进行javascript检查。

解决方案2:有点糟糕的解决方案。使用java.sql.DatabaseMetaData类检入DB端。如果需要多次检查多个字段,那就不好了。

java.sql.DatabaseMetaData类提供有关表的数据,如column_size,type_name等。例如:

 ResultSet rsColumns = null;
    DatabaseMetaData meta = conn.getMetaData();
    rsColumns = meta.getColumns(null, null, "aTableName", null);

其中aTableName是要研究的名称。使用特定tableName.columnName的column_size检查输入值长度。

答案 1 :(得分:0)

您可以使用JSR-303 Bean Validation注释来注释具有最大长度的字段,然后您可以使用验证器来检查是否满足这些注释,例如当调用setter时这也可以用来自动为您提供有意义的错误消息。

public class Registration {
  @Size(max = 80)
  @Column(name=”PARTNER_ROLE” length=”80”)
  private String partnerRole;

  // you need to get this from somewhere, but this depends on your environment
  private ValidatorFactory validatorFactory;

  public Set<ConstraintViolation<Registration>> validate() {
    Validator validator = validatorFactory.getValidator();
    return validator.<Registration>validate(this);
  }
}