当前位置: 首页 > 知识库问答 >
问题:

重复的键值违反唯一约束“x_pkey”

戈华茂
2023-03-14

当并发客户机试图将数据插入子表时,我们面临唯一的约束冲突问题。

假设我们有1以下的表格。用户user_id、first_name、last_name。2.项目project_idproject_name和project_description。

两者都有着多对多的关系。

当两个客户端试图创建一个新用户时。假设client1创建了user1(id=aa1),子记录项目(id=1)。Client2还创建了user2(id=aa2),子记录是项目(id=1)。当两个客户端同时保存记录user1,并且子客户端也插入时,当第二个客户端尝试作为项目(id-1)已经可用时,它抛出唯一的密钥约束冲突。

在关联子记录之前,我们正在检查findby(projectx)。

我们很少面对这个问题。当出现异常时,我们已实施重试操作。即使使用重试操作,问题也无法一致解决。请在这方面指导我。

异常为:HH000346:托管刷新期间出错[org.hibernate.Exception.ConstraintViolationException:无法执行语句。错误[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](ForkJoinPool.commonPool-worker-1)错误:重复键值违反唯一约束“x_key”

我们正在使用这个示例代码。

@Entity
@Table(name = "tbl_users", schema = "abcd")
public class user implements Serializable {
    private static final long serialVersionUID = -8153443692098431986L;
    @Id
    @Column(name = "userId", nullable = false)
    private String userid;

    @Column(name = "last_name", nullable = false)
    private String lastName;

    @Column(name = "first_name", nullable = false)
    private String firstName;

    @ManyToMany(mappedBy = "projectsSet", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Project> projectsSet;
}

@Entity
@Table(name = "tbl_projects", schema = "abcd")
public class Project implements Serializable {

    private static final long serialVersionUID = -8153443692098431986L;
    @Id
    @Column(name = "project_id", nullable = false)
    private String projectId;

    @Column(name = "project_Name", nullable = false)
    private String projectName;

    @Column(name = "projectDescription", nullable = false)
    private String projectDescription;

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
    @JoinTable(name = "users_projects", schema = "abcd", joinColumns = {@JoinColumn(name = "_projectId")},
            inverseJoinColumns = {@JoinColumn(name = "_userId")})
    private Set<User> usersSet;

}

@Transactional
public void saveProject(ProjectDTO projectDTO, Set<UserDTO> userDTOSet) {
    Optional<Project> optionalProject = getProjectFromDB(projectDTO.getProjectId());
    List<User> existUsers = null;

    if (!optionalProject.isPresent()) {

        Map<String, UserDTO> userDTOMap = userDTOSet.stream().collect(Collectors.toMap(UserDTO::getUserId, userDTO -> userDTO));
        if (MapUtils.isNotEmpty(userDTOMap)) {
            existingUsers = getUsersFromDB(userDTOMap.keySet());
        }
        Project project = new Project();
        try {
            BeanUtils.copyProperties(project, projectDTO)
            updateExistingUsers(project, userDTOMap, existingUsers);
            addNewUsers(project, userDTOMap);
        } catch (IllegalAccessException e) {
            throw new BeanCopyException("Exception raised while copying the data", e);
        } catch (InvocationTargetException e) {
            throw new BeanCopyException("Exception raised while copying the data", e);
        }

        try {
            ProjectRepository.save(user);
        } catch (Exception e) {

            throw new CustomException("Exception raised while saving the new Project", e);
        }

    }


    private void updateExistingUsers (Project
    newProject, Map < String, UserDTO > newUsers, List < User > existingUsers){
        if (CollectionUtils.isNotEmpty(existingUsers)) {
            existingUsers.stream().forEach(existinguser -> {
                newProject.addNewUser(existinguser);
                newUsers.remove(existinguser.getUserId());
            });
        }
    }


    private void addNewUsers(Project newProject, Map < String, UserDTO > userDTOMap){
        userDTOMap.values().stream().forEach(userDTO -> {
            User user = convertToModel(userDTO);
            newProject.addNewUser(newUser);
        });
    }

共有1个答案

闾丘鸣
2023-03-14

您可以尝试使用@SQLInsertUser使用自定义的“upsert”语句,因为我已经回答了几次了。请参见此处使用attachDirty(saveOrUpdate)Hibernate事务和并发

 类似资料:
  • 我在创建应用程序时遇到了这个问题。因此,每当我添加第一条评论时,问题都不会出现,但当我第二次尝试时,我会收到此错误: 重复的键值违反了唯一约束“tripplanner_discussion_author_id_key”详细信息:键 (author_id)=(1) 已存在。 我试图把放到 models.py,但它根本没有帮助。 models.py views.py 更新 当我登录到另一个用户时,一个

  • 这是我的stacktrace: 学生表: 学生实体:学生标识默认为自动递增 postgres控制台(这些学生由sql脚本创建): 在此处输入图像描述 我也尝试过这样生成,但这没有帮助 我用postgreql它似乎我有问题与id Generator,谢谢你的想法和答案

  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py

  • 我必须交换同一表的不同行的属性。 有一列“reference_id”在 DB 中具有唯一的约束。 代码: A 级- B级- 异常跟踪:

  • 我有一个笑话模型: 现在,当我试图迁移最后一行时,我得到了错误。基本上,我想将一个用户链接到Joke对象,因为我已经有了一个数据库,所以我希望默认值为1,这是管理员用户的id(我检查过了...).Makemigrations工作正常,但是当我尝试迁移时,我得到了这个: 我真的不明白怎么了。有什么想法吗?

  • 问题内容: 我正在跟着我先前提出的一个问题,在这个问题中,我试图寻求从愚蠢/编写不佳的mysql查询到postgresql的转换。我相信我成功了。无论如何,我正在使用从mysql数据库手动移动到postgres数据库的数据。我正在使用如下查询: 我有理由相信这很好。但是,这导致了新问题。尝试提交时,我从django收到一条错误,指出: 我已经看过这里发布的一些回复,但是我还没有找到解决我的问题的方