首页 > 解决方案 > 多个父级发生 JPA dataIntegrityViolationException

问题描述

我正在做简单的弹簧安全演示,并希望将用户和角色信息放入数据库。这是我的实体的简单结构。

@Entity
@Table(name = "users")
public class Users {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private Long userId;

@OneToMany(mappedBy = "users", fetch = FetchType.LAZY, orphanRemoval=true, cascade = CascadeType.ALL)
private List<UserRoleMapping> userRoleMapping;
}

//

@Entity
@Table(name = "user_role_mapping")
public class UserRoleMapping {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_role_mapping_id")
private Long userRoleMappingId;

@ManyToOne(fetch = FetchType.LAZY)
private Users users;

@ManyToOne(fetch = FetchType.LAZY)
private UserRole userRole;
}

//

@Entity
@Table(name = "users_role")
public class UserRole {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "role_id")
private Long roleId;

@Column(name = "role")
private String role;

@Column(name = "role_desc")
private String roleDesc;

@OneToMany(mappedBy = "userRole", fetch = FetchType.LAZY, orphanRemoval=true)
private List<UserRoleMapping> userRoleMapping;
}

在我的用例中,我必须确保何时创建用户,然后我必须插入子序列 userRoleMapping。如果 userRole 被删除,那么 userRoleMapping 也必须被删除。

所以我把 CascadeType.ALL 和 orphanRemoval=true 放在 users 实体中, orphanRemoval=true 放在 userRole 实体中。

但是,当我运行 userRoleRepository.delete(userRole) 时。我有 dataIntegrityViolationException。

我对其进行了一些研究,并了解它是一种 jpa 约束,以确保我们也删除父母(用户)。

请问我的用例是否有任何解决方法?

谢谢

标签: jpaspring-data-jpa

解决方案


这是我的用例的解决方案。而不是在两个实体中使用 OneToMany,我应该使用 ManyToMany 关系。这很有意义,因为我(现在)不关心 Java 逻辑中的映射。这是我的代码

public class Users {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private Long userId;

@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST })
@JoinTable
private Set<UserRole> userRole;
}

//

public class UserRole {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "role_id")
private Long roleId;

@Column(name = "role")
private String role;

@Column(name = "role_desc")
private String roleDesc;

@OneToMany(mappedBy = "userRole", fetch = FetchType.LAZY)
private Set<Users> users;
}

推荐阅读