Hibernate中@Size注解在hbm.xml中的等效Bean Validation配置
在Hibernate hbm.xml中实现@Size注解的等效校验配置
刚好遇到过类似混合使用注解和hbm映射的场景,我来给你详细拆解解决方案:
一、hbm.xml里的等效配置代码
@Size属于Bean Validation(JSR-380)的校验注解,在hbm.xml中需要通过<validations>标签嵌套<constraint>来配置,直接对应到你的属性上就行。示例如下:
<!-- 替换成你实际的属性名和列名 --> <property name="content" column="content_column" type="string"> <validations> <constraint annotation="javax.validation.constraints.Size"> <!-- 可选:如果不需要最小长度限制,可以去掉这个参数 --> <parameter name="min" value="0"/> <!-- 对应@Size(max=255),设置你需要的最大字符数 --> <parameter name="max" value="255"/> <!-- 自定义校验失败时的提示信息,和@Size(message="xxx")效果一致 --> <message>输入内容长度不能超过255个字符,请调整后重试</message> </constraint> </validations> </property>
二、关于你遇到的乱码长度问题的补充说明
你提到的textarea限制了255字符但保存时报256字节的问题,本质是字符数和字节数的差异:
- 前端的
maxLength是按Unicode字符数限制输入 - 数据库列的255长度是按字节数计算的(比如UTF-8下部分特殊字符/乱码可能占2-4个字节)
而@Size和上面的hbm配置都是按字符数做校验,刚好能在持久化前拦截不符合要求的内容,避免直接抛数据库异常,同时给用户友好提示。如果需要按字节数校验,那得自定义约束,但你的场景用字符数校验就足够解决当前问题了。
三、确保校验生效的必要条件
要让这个hbm里的校验生效,还得满足两个前提:
- 项目中已经引入了Bean Validation的依赖(比如
hibernate-validator,版本要和你的Hibernate版本兼容) - 在Hibernate配置文件(比如
hibernate.cfg.xml)中开启校验模式:
<property name="javax.persistence.validation.mode">ALL</property>
这个配置会让Hibernate在保存/更新实体时自动触发Bean Validation校验。
内容的提问来源于stack exchange,提问作者rj4u
相关产品推荐
相关产品推荐

