OneToOne映射:参照完整性约束违反

问题描述 投票:1回答:1

我正在使用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。

请让我知道你们是否可以帮助确定解决此问题的方法。

java database spring h2 hibernate-mapping
1个回答
0
投票

首先,我将为组和用户资源使用以下URL模式:

/groups/{groupId}
/users/{userId}

这将允许您分别创建用户和组,因为组可以不存在任何用户而存在,并且用户可以不作为组成员而存在。通常,对/ groups /进行POST操作以创建组,对/ users /进行POST操作以创建用户。创建了一个组和一个用户之后,我将检索两个实体(或使用POST操作返回的实体)来设置该组的组所有者并创建该组的JSON(或XML)表示形式。然后,将JSON表示形式放置到URL / groups / {groupId}(在URL中插入了组的实际ID),以便使用新的组所有者持久保存该组。希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.