Jpa映射表在出现约束错误时未删除



我想知道spring-jpa为什么不删除导致约束错误的行,或者用新角色编辑我的Account实体。

以下实体参与了我试图执行的操作。

@Entity
@Table(name = "account")
class AccountEntity(uuid: UUID? = null,
@Column(nullable = false) val email: String,
@Column(nullable = false) val password: String,
@OneToMany(
mappedBy = "accountUuid",
cascade = [CascadeType.ALL],
fetch = FetchType.LAZY
) val accountRolesEntity: List<AccountRolesEntity>) : BaseEntity(uuid)
@Entity
@Table(name = "account_roles")
class AccountRolesEntity(uuid: UUID? = null,
@Column(nullable = false) val accountUuid: UUID,
@OneToOne val role: RoleEntity) : BaseEntity(uuid)
@Entity
@Table(name = "role")
class RoleEntity(uuid: UUID? = null,
@Column(nullable = false) val name: String ) : BaseEntity(uuid)

因此,我正在尝试更新特定帐户的角色。

例如:如果X具有">viewer"one_answers">editor'角色,并且假设我只想将其更改为viewer

我做以下步骤:

  1. 从数据库请求帐户实体
  2. 将新帐户RolesEntity(从控制器接收(设置为帐户
  3. 调用jpa存储库保存方法

服务类中的方法:

fun updateExistingAccount(account: AccountDTO, adjustedRoles: List<RoleDTO>): AccountDTO {
val mappedRoles: List<AccountRolesEntity> = adjustedRoles.map { accountRolesMapper.map(account.uuid, it) }
val accountEntity = accountMapper.map(account, mappedRoles)
return accountMapper.map(accountRepository.save(accountEntity))
}

我得到的错误是:org.postgresql.util.PSQL异常:错误:重复的键值违反了唯一约束"account_roles_account_uuid_role_uuid_key">

这是因为我在数据库中有一个约束,以确保帐户可以而不是具有重复的角色。createtable语句如下:

CREATE TABLE account_roles (
uuid         UUID PRIMARY KEY,
account_uuid UUID NOT NULL REFERENCES account(uuid),
role_uuid    UUID NOT NULL REFERENCES role(uuid),
UNIQUE (account_uuid, role_uuid)
);

对此有一个修复方法,通过执行1乘1的所有操作:首先删除,然后进行新插入。但应该有更好的方法。

实际上"AccountRolesEntity"不是一个实体,它是一个表,通过将两个实体的ids保留在表中来保持两个实体之间的关系。

所以第一步,你应该有这样的东西,

@JoinTable(name = "account_role",
joinColumns = @JoinColumn(name = "account")
, inverseJoinColumns = @JoinColumn(name = "role"))
@OneToMany(mappedBy = "accountUuid",
cascade = [CascadeType.ALL],
fetch = FetchType.LAZY) 
val accountRolesEntity: List<AccountRolesEntity>) :BaseEntity(uuid)

我认为你的问题取决于你的级联类图,所以请再次检查它们。

最新更新