如何为JPA的AttributeConverter定义默认columnDefinition?
如何为JPA的AttributeConverter定义默认columnDefinition?
嘿,这个重复写@Column(columnDefinition = "CHAR(18)")的痛点我太懂了,每次复制粘贴确实挺烦的,给你几个实用的解决办法,看哪个适配你的场景:
自定义组合注解(推荐,JPA标准方案)
我们可以把常用的@Column和@Convert打包成一个自定义注解,这样每次使用时只需要加这一个注解就行。举个具体的例子:@Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Column(columnDefinition = "CHAR(18)") @Convert(converter = YourCustomConverter.class) // 替换成你的转换器类 public @interface Char18Type { }之后在实体类的字段上,直接用
@Char18Type标记就好,不用再分别写@Column和@Convert,彻底告别重复代码。利用Hibernate自定义UserType(仅适用于Hibernate作为JPA实现)
如果你的项目用Hibernate作为JPA提供商,还可以自定义一个UserType来封装类型转换和列定义逻辑:public class Char18Type implements UserType { @Override public int[] sqlTypes() { // 指定对应的SQL类型 return new int[]{Types.CHAR}; } @Override public Class<?> returnedClass() { return YourCustomDataType.class; // 替换成你的自定义类型 } @Override public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { String value = rs.getString(names[0]); return value != null ? yourDbToEntityConvertLogic(value) : null; } @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { if (value == null) { st.setNull(index, Types.CHAR); } else { st.setString(index, yourEntityToDbConvertLogic((YourCustomDataType) value)); } } // 按需实现equals、hashCode、deepCopy等其他必要方法 }接着在包级别或实体类上用
@TypeDef注册这个类型:@TypeDef(name = "char18", typeClass = Char18Type.class) @Entity public class YourEntity { @Type(type = "char18") private YourCustomDataType yourField; // ...其他字段 }这样Hibernate会自动处理对应的列定义,不用再手动写
columnDefinition。
总结一下,第一种组合注解的方法最通用,不管你用哪个JPA实现都能生效,优先推荐;如果是纯Hibernate项目,自定义UserType也是个不错的选择。
备注:内容来源于stack exchange,提问作者Sankozi
相关产品推荐
相关产品推荐

