加@Convert注解的JPA实体字段是否需按SonarQube要求设为transient?
标注@Convert注解后S1948规则是否依然生效
是,该规则依然会触发告警。
squid:S1948是Sonar的静态代码检查规则,核心校验逻辑为:所有实现了Serializable接口的类,其成员字段要么本身实现Serializable接口,要么被transient关键字修饰。这个规则只会基于Java原生序列化的规范做静态扫描,不会识别JPA的@Convert注解的特殊持久化逻辑,哪怕你已经通过转换器实现了Trip类型和数据库字段的映射,静态扫描阶段依然会判定该字段不符合Java序列化要求,触发告警,属于规则的场景局限性导致的误报。
给trip字段添加transient修饰符的影响
会对JPA实体管理造成严重负面影响,绝对不能加该修饰符。
根据JPA规范,被transient关键字修饰的实体字段,会被ORM框架直接标记为非持久化字段,不管你有没有加@Column、@Convert注解,该字段都不会参与数据库的增删改查映射:保存时不会把trip字段转换后存入数据库,查询时也不会把数据库的字段值转换为Trip对象赋值给该字段,完全不符合你现有的业务映射需求。
正确的修复方案
- 方案1:让Trip POJO类实现Serializable接口,成本最低,不会影响现有JPA转换逻辑,同时可以直接消除Sonar告警
- 方案2:如果业务上不允许Trip实现Serializable,可以在trip字段上添加注解
@SuppressWarnings("squid:S1948"),明确忽略该条误报告警即可。
内容的提问来源于stack exchange,提问作者lucasvc
相关产品推荐
相关产品推荐

