Search code examples
javaoraclejpamany-to-many

@ManyToMany annotation spring boot JPA with extra column and composite key ,Error inserting


I'm using spring boot 2.2.5 with Jpa and JDK 11 and for my database i'm using oracle 19c. I have a ManyToMany relationship between my entities User and Group. In my oracle database i have a associated (USER_GROUP) table with composite key (user_ID,group_ID). USER_ID and GROUP_ID are automaticaly generated in the database. I want when i insert a user in table USER JPA also insert in associated table USER_GROUP. But it return always cannot insert null in USER_ID,and this user id i don't have access because it generated automatily in database.

MyClass UserGroup:

@Entity
@Table(name = "USER_GROUP", schema = "TEST", catalog = "")
public class UserGroup  {

    private GroupUserPK  groupUserPK;
    private User user;
    private Group group;


    @EmbeddedId
    public GroupUserPK getGroupUserPK() {
        return groupUserPK;
    }
    public void setGroupUserPK(GroupUserPK groupUserPK) {
        this.groupUserPK = groupUserPK;
    }


    @JoinColumn(name = "FK_USER_ID")
    @MapsId("fkUserId")
    @ManyToOne(fetch = FetchType.LAZY)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @JoinColumn(name = "FK_GROUP_ID")
    @MapsId("fkGroupId")
    @ManyToOne(fetch = FetchType.LAZY)
    public Group getGroup() {
        return group;
    }
}

UserGroupPK

@Embeddable
public class GroupUserPK implements Serializable {
    private static final long serialVersionUID = 1L;

    private long fkUserId;
    private long fkGroupId;


    @Column(name = "FK_USER_ID")
    @Id
    public long getFkUserId() {
        return fkUserId;
    }

    public void setFkUserId(long fkUserId) {
        this.fkUserId = fkUserId;
    }
    @Column(name = "FK_GROUP_ID")
    @Id
    public long getFkGroupId() {
        return fkGroupId;
    }
    public void setFkGroupId(long fkGroupId) {
        this.fkGroupId = fkGroupId;
    }

}

MyClass Group:


@Entity
@Table(name = "GROUP", schema = "TEST", catalog = "")
public class Group {
    private long groupId;
    private String nom;
    private Collection<UserGroup> userGroup;

    @Id
    @Column(name = "GROUP_ID")
    public long getGroupId() {
        return groupId;
    }

    public void setGroupId(long groupId) {
        this.groupId = groupId;
    }

    @Basic
    @Column(name = "DESIGN")
    public String getDesign() {
        return design;
    }

    public void setDesign(String design) {
        this.design = design;
    }


    @OneToMany(mappedBy = "group",cascade = {CascadeType.ALL})
    public Collection<UserGroup> getUserGroup() {
        return userGroup;
    }

    public void setUserGroup(Collection<UserGroup> userGroup) {
        this.userGroup = userGroup;
    }

}

MyClass User

@Entity
@Table(name = "USER", schema = "TEST", catalog = "")
public class User {
    private long userId;
    private String nom;
    private Collection<UserGroup> userGroup;

    @Id
    @Column(name = "USER_ID")
    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    @Basic
    @Column(name = "DESIGN")
    public String getDesign() {
        return design;
    }

    public void setDesign(String design) {
        this.design = design;
    }


    @OneToMany(mappedBy = "user",cascade = {CascadeType.ALL})
    public Collection<UserGroup> getUserGroup() {
        return userGroup;
    }

    public void setUserGroup(Collection<UserGroup> userGroup) {
        this.userGroup = userGroup;
    }

}

Any help please.


Solution

  • Edit

    I solved this problem by adding "addGroup" method in my entity User.

    My entity user updated as,

    @Entity
    @Table(name = "USER", schema = "TEST", catalog = "")
    public class User {
        private long userId;
        private String nom;
        private Collection<UserGroup> userGroups;
    
        @Id
        @Column(name = "USER_ID")
        public long getUserId() {
            return userId;
        }
    
        public void setUserId(long userId) {
            this.userId = userId;
        }
    
        @Basic
        @Column(name = "DESIGN")
        public String getDesign() {
            return design;
        }
    
        public void setDesign(String design) {
            this.design = design;
        }
    
    
        @OneToMany(mappedBy = "user", cascade = {CascadeType.ALL})
        public Collection<UserGroup> getUserGroups() {
            return userGroups;
        }
    
        public void setUserGroup(Collection<UserGroup> userGroups) {
            this.userGroups = userGroups;
        }
    
        public void addGroup(Group group) {
            UserGroup  userGroup = new UserGroup(this, group);
            userGroups.add(userGroup);
            group.getUserGroups().add(userGroup);
        }
    
    
    }
    
    

    After that we called this method in UserService.