【问题标题】:JPA - One To Many With Join TableJPA - 一对多与连接表
【发布时间】:2021-08-23 20:35:54
【问题描述】:

我有一个需要为每个组保存多个组成员名称的情况。任何人都可以帮助实现这一目标?

@Entity
@Table(name = "groups")
public class Groups {

private Integer id;

private String groupName;

private List<String> groupMembers;

}

我尝试使用 ElementCollection 表。在此,我无法删除特定的组成员名称,而是需要删除整行。这是我的问题,我无法操纵特定数据(在组成员列表中)。

@ElementCollection
    @CollectionTable(name = "group_members", joinColumns = @JoinColumn(name = "group_id"))
private List<String> groupMembers;

【问题讨论】:

  • save multiple group members name for each group 是什么意思?
  • @RamanSahasi,这意味着API请求将包含一个组名称及其成员名称为List。我需要在不使用任何其他实体类的情况下将所有成员的名称保存在一个组名(一对多)中。
  • 那么您面临什么问题?我在您的问题中没有看到与 API 相关的任何内容,但如果您尝试通过 API 保存组和组成员,那么您可以使用 @RequestBody
  • @RamanSahasi,我已经更新了我的查询。问题在于将请求中的多个成员的名称存储到表中。

标签: java postgresql spring-boot jpa spring-data-jpa


【解决方案1】:

如果您希望操作属于某个 Group 的单个 Group Members,那么您应该为 GroupMembers 提供一个单独的表。

您必须为 GroupMembers 创建一个单独的类

Group 类:

        @Entity
    @Table(name = "groups")
    public class Group implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    
    @Column
    private String groupName;
    
    public String getGroupName() {
        return groupName;
    }
    
    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "post", orphanRemoval = true)
    private List<GroupMember> groupMembers = new ArrayList<>();
    //getters and setters
    
    public void addGroupMember(GroupMember groupMember) {
        groupMembers.add(groupMember);
        groupMember.setGroup(this);
    }
public void removeGroupMember(GroupMember groupMember) {
    groupMember.setGroup(null);
    this.groupMembers.remove(groupMember);
  }
    }

GroupMember 类

@Entity
public class GroupMember {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column
private String name;

@ManyToOne
private Group group;
//getters and setters

在你的控制器中使用它

@GetMapping(value = "/addGroupMembers")
public void testGroup() {
    Group group = new Group();
    group.setGroupName("group_name1");
    GroupMember gm = new GroupMember();
    gm.setName("peter");
    GroupMember gm2 = new GroupMember();
    gm2.setName("john");
    group.addGroupMember(gm);
    group.addGroupMember(gm2);

    service.saveGroup(group);
}

这将在 GroupMember 表中创建一个引用 Group 的外键。 我知道您的问题是使用 @JoinTable,但通常不需要单独的表。见One-To-Many Relationship with Join Table

另外,如果您不熟悉 Spring Data JPA 和表创建,请阅读https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2016-07-02
    • 2010-11-25
    相关资源
    最近更新 更多