1

I have a case where need to save multiple group members name for each group. Anyone could help to achieve this?

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

private Integer id;

private String groupName;

private List<String> groupMembers;

}

I tried to use ElementCollection Table. In this, I couldn't delete a specific Group Member Name instead need to delete the entire row. This is my issue, I couldn't manipulate specific data (In Group Member List).

@ElementCollection
    @CollectionTable(name = "group_members", joinColumns = @JoinColumn(name = "group_id"))
private List<String> groupMembers;
Prem
  • 11
  • 5
  • `save multiple group members name for each group` what does that mean? – Raman Sahasi Jun 06 '21 at 14:23
  • @RamanSahasi, It means the API request will contain a group name and its members name as List. I need to save all member's names against a single group name (One To Many) without using any additional entity class. – Prem Jun 06 '21 at 14:26
  • So what problem are you facing? I don't see anything related to API in your question but if you're trying to save Groups and Group Members through an API, then you can use [`@RequestBody`](https://stackoverflow.com/a/11291986/2815219) – Raman Sahasi Jun 06 '21 at 14:32
  • @RamanSahasi, I have updated my query. And the issue is in storing the multiple member's names from the request into a table. – Prem Jun 06 '21 at 14:38

1 Answers1

1

If you wish to manipulate individual Group Members belonging to a Group , then you should have a separate table for GroupMembers.

You have to create a separate class for GroupMembers

The Group class:

        @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);
  }
    }

The GroupMember class

@Entity
public class GroupMember {

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

@Column
private String name;

@ManyToOne
private Group group;
//getters and setters

Use this in your controller

@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);
}

This will create a foreign key referencing to Group in the GroupMember table. I know your question was to use @JoinTable, but a separate table usually isn't needed. See One-To-Many Relationship with Join Table

Also, if you are new to Spring Data JPA and table creations, please read https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

mnagdev
  • 384
  • 3
  • 11