【问题标题】:@ManyToMany annotation spring boot JPA with extra column and composite key ,Error inserting@ManyToMany 注释spring boot JPA,带有额外的列和复合键,插入错误
【发布时间】:2021-02-05 08:29:30
【问题描述】:

我正在使用带有 Jpa 和 JDK 11 的 Spring Boot 2.2.5,而对于我的数据库,我正在使用 oracle 19c。 我的实体用户和组之间存在多对多关系。 在我的 oracle 数据库中,我有一个带有复合键 (user_ID,group_ID) 的关联 (USER_GROUP) 表。 USER_ID 和 GROUP_ID 在数据库中自动生成。 我想当我在表 USER JPA 中插入用户时也插入关联表 USER_GROUP。 但它返回总是不能在 USER_ID 中插入 null,而且这个用户 id 我没有访问权限,因为它是在数据库中自动生成的。

MyClass 用户组:

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

用户组PK

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

}

我的班级组:


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

}

我的班级用户

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

}

请帮忙。

【问题讨论】:

  • 错误是什么?你能提供堆栈跟踪吗?
  • 我没有错误,它没有插入关联表“GROUP_USER”
  • 表应该是 USER_GROUP 对吧?然后提供用于保存的测试方法
  • 好的,谢谢你现在对我有用
  • 回答你自己的问题,它可能会帮助别人

标签: java oracle jpa many-to-many


【解决方案1】:

编辑

我通过在我的实体用户中添加“addGroup”方法解决了这个问题。

我的实体用户更新为,

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


}

之后我们在 UserService 中调用了这个方法。

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2018-12-12
    • 2021-09-19
    • 2019-03-09
    • 1970-01-01
    • 2018-10-12
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多