在JHipster中处理非实体类集合的最优方案是什么?
在JHipster中处理非实体类集合的最优方案
我们正在对接第三方REST API,大量接口响应的JSON数据包含JSON数组,最常见的就是字符串数组。为了在关系型数据库中存储这类结构的数据,需要进行数据转换,目前的示例实现如下:
public class StringListConverter implements AttributeConverter<List, String> { @Override public String convertToDatabaseColumn(List<String> strings) { if (strings == null) { return null; } return String.join(",", strings); } @Override public List<String> convertToEntityAttribute(String joinedStrings) { if (joinedStrings == null) { return null; } return Arrays.asList(joinedStrings.split(",")); } } @Entity public class Foo { @Convert(converter = StringListConverter.class) private List<String> strings; // 其他属性及方法省略 }
将此类集合数据转换为多对一关系,把字符串列表当作实体类列表来处理完全没有意义。
据了解,JHipster没有开箱即用的非实体类集合处理方式,因此想请教在JHipster中处理这类场景的最优方案是什么?
更新:JSON数据处理方案参考
根据GaeL的建议,我咨询后得到三种基于Spring Data JPA的JSON数据存储方案,具体如下:
方案一:直接存储JSON字符串到PostgreSQL的JSONB列
以下是使用Spring Data JPA将JSON数据保存到PostgreSQL的步骤:
- 创建PostgreSQL数据库及包含JSON列的表,创建Spring Boot项目并在pom.xml中添加对应依赖;
- 创建包含JSONB类型属性的Java实体类;
- 创建继承CrudRepository的仓库接口,提供数据增删改查方法;
- 配置数据库连接,在应用中通过仓库实例保存JSON数据。
示例代码:
@Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @JSONB private String data; public Person() { } public Person(String data) { this.data = data; } // Getter和Setter方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getData() { return data; } public void setData(String data) { this.data = data; } } public interface PersonRepository extends CrudRepository<Person, Long> {} // 保存数据示例 Person person = new Person("{\"name\": \"John Doe\", \"age\": 30}"); personRepository.save(person);
JSON数据会被保存到Person表的data列中,后续可直接查询获取该JSON数据。
方案二:使用自定义Converter转换JSON与Map结构
示例代码:
@Entity public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Convert(converter = JsonToMapConverter.class) private Map<String, String> info; // 其他属性及方法省略 } public class JsonToMapConverter implements AttributeConverter<Map<String, String>, String> { @Override public String convertToDatabaseColumn(Map<String, String> attribute) { return JSON.toJSONString(attribute); } @Override public Map<String, String> convertToEntityAttribute(String dbData) { return JSON.parseObject(dbData, Map.class); } } // 保存与查询示例 Customer customer = new Customer("John Doe", new HashMap<>(Map.of("age", "30", "country", "USA"))); customerRepository.save(customer); Customer customer = customerRepository.findById(1L).get(); Map<String, String> info = customer.getInfo(); System.out.println(info);
方案三:直接映射自定义对象/集合到JSONB列
对于单个自定义对象:
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "jsonb") private UserInfo userInfo; public User() { } public User(UserInfo userInfo) { this.userInfo = userInfo; } // 其他属性及方法省略 } // 保存数据示例 User user = new User(new UserInfo("John Doe", "john.doe@example.com")); userRepository.save(user);
对于JSON数组(字符串列表或自定义对象列表),只需采用相同思路:
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "jsonb") private List<String> phoneNumbers; @Column(columnDefinition = "jsonb") private List<UserInfo> userInfoList; public User() { } public User(List<String> phoneNumbers, List<UserInfo> userInfoList) { this.phoneNumbers = phoneNumbers; this.userInfoList = userInfoList; } // 其他属性及方法省略 } // 保存数据示例 User user = new User( Arrays.asList("123-456-7890", "987-654-3210"), Arrays.asList(new UserInfo("John Doe", "john.doe@example.com"), new UserInfo("Jane Doe", "jane.doe@example.com")) ); userRepository.save(user);
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

