SpringBoot数据-如何删除共享一个ID的所有行?

时间:2018-09-04 21:32:07

标签: hibernate spring-boot spring-data-jpa

可以说我有一个名为“ 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

2 个答案:

答案 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_ROLESuserId的复合主键)

或通过HQL删除

roleId

但是理想情况下,在使用ORM时,映射表中的唯一主键是非常必要的,否则您可能会遇到更多问题。