我正在使用Spring Data JPA开发REST API,需要一些帮助。
我的REST API将处理创建组的请求,并根据请求数据将成员分配给该组。请求的URL为@PostMapping("/createGroup/{user-id}/groups")
我有以下课程,会员类别:
public class Member {
private int memberId;
private String memberName;
private String memberCity;
// getters / setters
我的请求正文类:
public class AppRequest {
private String name;
private String description;
private List<Member> members;
// getters / setters
我的GroupEntity:
@Entity
@Table(name="Groups")
public class GroupEntity {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@OneToOne
@JoinColumn(name="groupOwnerId")
private MemberEntity groupOwnerId;
private String groupName;
private String description;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name="Group_Members",
joinColumns= @JoinColumn(name="id"),
inverseJoinColumns= @JoinColumn(name="memberId")
)
Set<MemberEntity> members = new HashSet<>();
// getters / setters
我的会员实体:
@Entity
@Table(name="Members")
public class MemberEntity {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int memberId;
private String memberName;
private String memberCity;
@ManyToMany(cascade=CascadeType.ALL, mappedBy="members")
Set<GroupEntity> groups = new HashSet<>();
// getters / setters
最后是我的控制器,
@RestController
public class AppController {
@Autowired
MemberRepository memRepo;
@Autowired
GroupRepository groupRepo;
@PostMapping("/createGroup/{user-id}/groups")
@Transactional
public ResponseEntity<AppResponse> createGroup(@RequestBody AppRequest request,
@PathVariable(name="user-id") String userId) {
AppResponse response = new AppResponse();
GroupEntity group = new GroupEntity();
group.setGroupName(request.getName());
group.setDescription(request.getDescription());
// Code that causes error when trying to save owner ID
MemberEntity mem = new MemberEntity();
mem.setMemberId(Integer.parseInt(userId));
group.setGroupOwnerId(mem);
List<Member> members = request.getMembers();
Set<MemberEntity> storedMembers = new HashSet<>();
Set<GroupEntity> storedGroups = new HashSet<>();
storedGroups.add(group);
for(Member member : members) {
if(member.getMemberId() != 0) { // existing member
MemberEntity memberentity = new MemberEntity();
memberentity.setMemberName(member.getMemberName());
memberentity.setMemberCity(member.getMemberCity());
storedMembers.add(memberentity);
memberentity.setGroups(storedGroups);
memRepo.save(memberentity);
}
else { // new member
//some logic
}
group.setMembers(storedMembers);
groupRepo.save(group);
}
return null;
}
}
请求正文将是这样,
{
"description": "Funny Group",
"members": [
{
"memberCity": "Mumbai",
"memberName": "Amit"
},
{
"memberId": 123
}
],
"name": "My Group"
}
[我想要实现的是在创建组时,我想在REST URL [/ createGroup / {user-id} / groups]中添加用户ID作为该组的所有者ID。为此,我将手动创建一个成员实体并将其设置为groupOwnerId,如下所示,
MemberEntity mem = new MemberEntity();
mem.setMemberId(Integer.parseInt(userId));
group.setGroupOwnerId(mem);
如果我在上面的代码段中注释,则应用程序启动,但是groupOwnerId值设置为null,这很明显,因为我没有在任何地方设置它。因此,如果我编写以上代码,则应用程序可以正常启动。但是当我击中终点时,我得到了以下错误,
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKB0L8UXRYL2TEVI7BTCMI4BYOD: PUBLIC.""GROUPS"" FOREIGN KEY(GROUP_OWNER_ID) REFERENCES PUBLIC.MEMBERS(MEMBER_ID) (12345)"; SQL statement:
insert into groups (id, description, group_name, group_owner_id) values (null, ?, ?, ?)
我试图弄清楚如何正确地进行映射,以便可以从URL映射groupOwnerId。新成员也将使用自动生成的ID保存到数据库中。
目前我正在使用H2数据库,但最终将使用MySQL或Oracle。
请让我知道你们是否可以帮助确定解决此问题的方法。
首先,我将为组和用户资源使用以下URL模式:
/groups/{groupId}
/users/{userId}
这将允许您分别创建用户和组,因为组可以不存在任何用户而存在,并且用户可以不作为组成员而存在。通常,对/ groups /进行POST操作以创建组,对/ users /进行POST操作以创建用户。创建了一个组和一个用户之后,我将检索两个实体(或使用POST操作返回的实体)来设置该组的组所有者并创建该组的JSON(或XML)表示形式。然后,将JSON表示形式放置到URL / groups / {groupId}(在URL中插入了组的实际ID),以便使用新的组所有者持久保存该组。希望这会有所帮助!