技术背景:
Json用的jackson,ORM框架用的hibernate-jpa
1 2 3 4 5 6 7 8 9 10 11 12 13
| <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>
|
需求:
最近做需求,前端一个对象需要新增一个List<String>的字段,后端传给前端的是json,Json序列化对应的实体类刚好也是映射数据库的实体类
大概如下:
1 2 3 4 5 6 7 8 9
| @Entity @Table(name = "tb_user") @JsonIgnoreProperties(ignoreUnknown = true) public class User { @Column(name = "names") private List<String> names; }
|
数据库新增的字段是names,类型是varchar,如果就这样启动项目,会报错,字段类型不匹配。
解决方案
Hibernate有一个接口AttributeConverter<X, Y>,实现这个接口,可以在映射时,自动地将Entity 类的X类型转成与数据库对应的Y类型。
具体代码如下

这里做实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import javax.persistence.AttributeConverter; import java.util.List;
@Converter public class StrList2JsonConverter implements AttributeConverter<List<String>, String> { @Override public String convertToDatabaseColumn(List<String> strings) {
return null; } @Override public List<String> convertToEntityAttribute(String s) {
return null; } }
|
此外,还需要在实体类的字段上加上注解,表明要使用这个converter
1 2 3
| @Column(name = "names") @Convert(converter = StrList2JsonConverter.class) private List<String> names;
|
至此实现目标效果
最后附上,个人博客网站:Southblock’Blog,内容更多,更新,欢迎参观。