springjpa 在使用映射关系时如何通过ID序列化实体类

未觉雨声
  • 1.3k

目前有如下两个实体类,其中 Group 单向多对一 User

@Entity
public class User {
    @Id
    private String id;
}
@Entity
public class Group {
    @Id
    private String id;

    @JoinColumn(name = "user_id")
    @ManyToOne
    private User user;
}

GroupController 中通过 @RequestBody 接收参数并反序列化来创建 Group

@RestController
@RequestMapping("/group")
public class SubscriptionController {
    @Resource
    private GroupService groupService; // 包含增删改查的实现

    @PostMapping
    public Subscription createGroup(@RequestBody Group group) {
        return groupService.createGroup(group);
    }
}

但此时如果前端传入 userId 是否无被正确实例化 User 对象的:

{
    "userId": "testUser"
}

需要按以下方式传参才可以被正确实例化:

{
    "user": { "id": "testUser" }
}

如果想要通过 userId 实例化,目前需要通过以下方式实现:

@RestController
@RequestMapping("/group")
public class SubscriptionController {
    @Resource
    private GroupService groupService; // 包含增删改查的实现

    @PostMapping
    public Subscription createGroup(@RequestBody Map<String, String> map) {
        User user = new User();
        user.setId(map.get("userId"));
        Group group = new Group();
        group.setUser(user);
        return groupService.createGroup(group);
    }
}

不知道 jpa 里有没有提供一些比较便捷的方式实现通过 userId 实例化被映射的 User

回复
阅读 878
1 个回答

目前找到一种方式可以不脱离 jpa 的机制实现:

@Entity
public class Group {
    @Id
    private String id;

    public String getUserId() {
        return user != null ? user.getId() : "";
    }

    @Transient
    public void setUserId(String userId) {
        if (user == null) user = new User();
        user.setId(userId);
    }

    @JoinColumn(name = "user_id")
    @ManyToOne
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) // 序列化时忽略
    private User user;
}
宣传栏