Mysql 使用JPA/Spring/Hibernate自动截断字符串列的方法?

Mysql 使用JPA/Spring/Hibernate自动截断字符串列的方法?,mysql,spring,hibernate,jpa,jpa-2.0,Mysql,Spring,Hibernate,Jpa,Jpa 2.0,我正在使用Spring3.1.1.RELEASE、JPA2.0和Hibernate4.1.0.Final。我有一个VARCHAR(100)类型的MySQL 5.5列。如果我保存一个值大于100个字符的实体,不出所料,保存会失败并出现错误 SQL [n/a]; nested exception is org.hibernate.exception.DataException: Data truncation: Data too long for column 'MY_COL' at row 1

我正在使用Spring3.1.1.RELEASE、JPA2.0和Hibernate4.1.0.Final。我有一个VARCHAR(100)类型的MySQL 5.5列。如果我保存一个值大于100个字符的实体,不出所料,保存会失败并出现错误

SQL [n/a]; nested exception is org.hibernate.exception.DataException: Data truncation: Data too long for column 'MY_COL' at row 1
org.springframework.dao.DataIntegrityViolationException:数据截断:数据对列太长


有没有办法设置Spring/Hibernate/JPA,这样如果我的字符串值太长,数据就会自动截断到最大长度?我意识到我可以添加代码来自动检查字符串是否为100个字符,然后用Java截断字符串,但我想知道是否有一种不那么严格的方法来做到这一点。

有什么理由不将截断放在setString(String)方法中?您似乎有一个域规则,它应该始终被截断为100个字符,因此请强制执行它:

public void setName(String name) {
    this.name = name.length() > 100 ? name.substring(0,100) : name;
}
如果这看起来太困难和冗长,而且您一直都在这样做,那么为什么不使用SpringAOP并创建您自己的注释呢

@Truncate(length=100)

看一看,实际上,这可能没有用。它只是将验证向前推进。@Column(name=“mystringcolumn”,length=100)?如果Hibernate正在生成您的数据库,那么所做的就是定义一个长度为100的列。这与验证无关。我认为这正是Dave所说的“我可以添加代码来自动检查”的意思。嗯。。。如果没有至少一些代码,它不会神奇地发生。向任何应该截断的集合方法添加注释似乎是尽可能少的。Andrei是对的——您最初包含的内容就是我所说的“我可以添加代码以自动检查”。我希望有一些预先打包的注释或其他指令,允许在不必编写自定义代码的情况下截断内容。