Spring Boot中@Embedded/@Embeddable数据无法存入数据库的问题
解决Spring Boot中@Embedded嵌套对象无法存储的问题
以下是针对你遇到的嵌套对象存储失败问题的具体排查和修改方案:
1. 补全实体类的Getter/Setter方法
Spring通过Getter/Setter方法完成请求体到实体对象的属性绑定,缺失这些方法会导致字段无法被赋值,最终出现null值。
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Embedded private Address address; // 必须添加所有字段的Getter/Setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } } @Embeddable public class Address { private String street; private String city; // 同样需要补全Getter/Setter public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
2. 控制器方法添加@RequestBody注解
如果POST接口没有用@RequestBody标记参数,Spring无法将JSON请求体解析为User对象,导致传入的对象属性全为null。
@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @PostMapping public User createUser(@RequestBody User user) { // 必须添加@RequestBody return userService.saveUser(user); } }
3. 验证服务层与仓库层的保存逻辑
确保服务层直接传递完整的User对象到仓库,不要在中间环节错误重置字段:
// 仓库接口需正确继承JpaRepository public interface UserRepository extends JpaRepository<User, Long> {} @Service public class UserService { @Autowired private UserRepository userRepository; public User saveUser(User user) { // 直接保存传入的对象,不要额外修改或创建空对象 return userRepository.save(user); } }
4. 检查H2数据库配置
确保application.yml中开启了自动建表和SQL日志,方便排查数据是否被写入:
spring: datasource: url: jdbc:h2:mem:testdb driverClassName: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: update # 自动创建/更新表结构 show-sql: true # 打印SQL语句,验证插入操作是否执行 h2: console: enabled: true # 开启H2控制台,可直接查看数据库数据
5. 确认请求JSON格式正确性
发送的POST请求体必须符合嵌套对象的结构,字段名需与实体类一致:
{ "name": "张三", "address": { "street": "朝阳路123号", "city": "北京" } }
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

