gpt4 book ai didi

java - 一对一映射 : Referential integrity constraint violation

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:05 24 4
gpt4 key购买 nike

我正在使用 Spring Data JPA 开发 REST API,需要一些帮助。

我的 REST API 将处理创建组的请求,并根据请求数据将成员分配给该组。请求的 URL 将为 @PostMapping("/createGroup/{user-id}/groups")

我有以下类(class),成员(member)等级:

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

我的组实体:

@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

我的成员(member)实体:

@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

最后是我的 Controller ,

@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 表示形式 PUT 到 URL/groups/{groupId}(在 URL 中插入组的实际 ID),以便将组与新组所有者一起保存。
希望这有帮助!

关于java - 一对一映射 : Referential integrity constraint violation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58425538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com