JPA dataIntegrityViolationException происходит для нескольких родителей - PullRequest
0 голосов
/ 07 октября 2018

Я работаю над простой весенней демонстрацией безопасности и хочу поместить информацию о пользователе и роли в базу данных.Вот простая структура моей сущности.

@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 в сущности пользователей, а orphanRemoval = true в сущности userRole.

Однако, когда я запускаю userRoleRepository.delete (userRole).У меня есть dataIntegrityViolationException.

Я провел некоторые исследования и понял, что это своего рода ограничение jpa, чтобы убедиться, что мы также удаляем родителей (пользователей).

Могу ли я спросить, есть ли обходной путь для моегослучай использования?

Спасибо

1 Ответ

0 голосов
/ 10 октября 2018

Вот решение моих вариантов использования.Вместо того, чтобы использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...