jpa - 多个父级发生 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 约束,以确保我们也删除父母(用户)。
请问我的用例是否有任何解决方法?
谢谢
解决方案
这是我的用例的解决方案。而不是在两个实体中使用 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;
}
推荐阅读
- java - 默认maven包中的域名
- c# - 如何从 Xamarin 表单中的 ViewModel 获取数字输入
- java - 使用eclipse时tomcat中的Java类文件没有链接/更新
- c# - 在循环内将数据插入数据库时,有没有办法使 foreach 循环更快?
- javascript - web worker - 获取数据并将它们存储到浏览器扩展数据库中
- android - 如何将 Xamarin.Forms.ImageSource 转换为 Android.Graphics.Bitmap?
- boto3 - 如何使用 boto3 获取所有快照详细信息?
- debugging - 如果 Visual Query 在调试过程中完美运行,但 cshtml 代码无法访问数据,我该如何调试 2sxc 的工作?
- sql-server - How to propagate Always encrypted column encryption to Test, Acceptance and Production?
- macos - How to map memory in DriverKit using IOMemoryDescriptor::CreateMapping?