Spring Data Oracle NoSQL中@NosqlTable添加Map字段存储异常求助
问题:Oracle NoSQL Spring Data中Map字段存储异常
在Oracle NoSQL的@NosqlTable实体类中添加Map字段后,使用Spring Data保存时,Map被序列化为HashMap的内部结构而非预期的键值对形式。
实体类代码(Customer.java)
@NosqlTable(storageGB = 1, writeUnits = 10, readUnits = 10) public class Customer { @NosqlId(generated = true) long customerId; String firstName; String lastName; Map hashMap; Date createdAt; @Override public String toString() { return "Customer{" + "customerId=" + customerId + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", createdAt='" + createdAt + '\'' + ", hashMap='" + hashMap + '\'' + '}'; } }
Repository代码(CustomerRepository.java)
import com.oracle.nosql.spring.data.repository.NosqlRepository; public interface CustomerRepository extends NosqlRepository<Customer, Long> { Iterable<Customer> findByLastName(String lastname); }
保存数据代码
Customer s1 = new Customer(); s1.firstName = "John"; s1.lastName = "Doe"; HashMap s1Map = new HashMap() ; s1Map.put("name", "myMap") ; s1Map.put("use", true); s1.hashMap = s1Map; repo.save(s1);
异常存储结果
{ "createdAt": null, "firstName": "John", "hashMap": { "entrySet": null, "keySet": null, "loadFactor": 0.75, "modCount": 2, "size": 2, "table": [ null, null, null, null, null, null, { "hash": 116102, "key": "use", "next": null, "value": true }, null, { "hash": 3373752, "key": "name", "next": null, "value": "myMap" }, null, null, null, null, null, null, null ], "threshold": 12, "values": null }, "lastName": "Doe" }
解决方案
问题根源在于两点:
- 未使用泛型类型:原始类型
Map无法让Spring Data Oracle NoSQL识别键值对结构,导致序列化时解析了HashMap的内部属性。 - 缺少专属注解:需要给Map字段添加
@NosqlMap注解,明确告知驱动该字段是键值对集合类型。
修改后的Customer实体类代码:
@NosqlTable(storageGB = 1, writeUnits = 10, readUnits = 10) public class Customer { @NosqlId(generated = true) long customerId; String firstName; String lastName; // 指定泛型并添加@NosqlMap注解 @NosqlMap Map<String, Object> hashMap; Date createdAt; @Override public String toString() { return "Customer{" + "customerId=" + customerId + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", createdAt='" + createdAt + '\'' + ", hashMap='" + hashMap + '\'' + '}'; } }
修改后存储的结果会变为预期的键值对结构:
{ "createdAt": null, "firstName": "John", "hashMap": { "name": "myMap", "use": true }, "lastName": "Doe" }
如果Map的键值是特定类型(比如Map<String, String>),可以明确指定泛型类型,让序列化和反序列化逻辑更严谨。
内容的提问来源于stack exchange,提问作者user3346812
相关产品推荐
相关产品推荐

