可以说我有一个名为“ USER”的表。在此表中,我拥有所有用户数据,并且为用户分配了唯一的ID,因此每一行都是唯一的。
它看起来像这样:
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
@Column(name = "USER_ID")
private Long userId;
@Column(name = "FRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
... a lot more stuff ...
}
我还有另一个表,在其中分配了用户具有的所有角色,每一行看起来像这样:
@Entity
@Table(name = "USER_ROLES")
public class UserRoleMap {
@Id
@Column(name = "USER_ID")
Long userId;
@Column(name = "USER_ROLE_ID")
Long userRoleId;
@Column(name = "UPDATED_DATE")
String updatedDate;
@Column(name = "UPDATED_BY")
String updatedBy;
}
此表没有明确的唯一键。数据很容易如下所示,其中12278
是唯一的userId。
12,278 8,420 pretend_timestamp admin_user
12,278 8,430 pretend_timestamp admin_user
12,278 8,476 pretend_timestamp admin_user
12,278 8,478 pretend_timestamp admin_user
12,278 18,578 pretend_timestamp admin_user
12,278 8,482 pretend_timestamp admin_user
12,278 18,539 pretend_timestamp admin_user
那我该如何使用惯用的spring-boot进行以下操作?
DELETE USER_ROLES where USER_ID = 12278
我尝试了以下操作,但是spring-boot引发错误:
userRoleRepository.deleteById(user.getUserId);
给予
org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update
答案 0 :(得分:1)
在您的UserRoleRepository
界面上,尝试以下操作:void deleteAllByUserId(Long userId);
,然后在您的服务逻辑中调用它。
答案 1 :(得分:0)
据我所知,UserRoleMap
实体的设计是错误的,因为您提到userId
作为ID(即主键)。因此,始终要求{{1 }}对于userId
表(这是主键的功能)中的每一行应唯一。
根据我的说法,在创建表时,您可能没有在表脚本中将USER_ROLES
定义为主键,并且可能是通过插入查询而不是spring-data-jpa插入了数据。
现在,当您尝试userId
时,它会在spring-data-jpa中期望只查找一行并删除(因为您为deleteById
提到了@Id
),但是由于您表中有多行具有相同的userId
,您将面临上述异常。
最好的解决方案是在userId
表中创建适当的主键(可能是USER_ROLES
和userId
的复合主键)
或通过HQL删除
roleId
。
但是理想情况下,在使用ORM时,映射表中的唯一主键是非常必要的,否则您可能会遇到更多问题。