Я реализующий однонаправленный OneToMany между пользователем с ролью субъектов, как описано в https://examples.javacodegeeks.com/enterprise-java/jpa/one-to-many-unidirectional-mapping-in-jpa/Однонаправленный OneToMany отношения индуцирует UniqueConstraint
UserDataImpl.java:
@Entity
public class UserDataImpl {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
.
.
.
@OneToMany(targetEntity = RoleDataImpl.class, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_role_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
//Constructors
//Getters and setters
//Hashcode and equals
//toString
}
RoleDataImpl.java:
@Entity
public class RoleDataImpl {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private byte permissionsInByte = 0;
//Constructors
//Getters and setters
//Hashcode and equals
//toString
}
Мои UserRepository и RoleRepository расширяет JpaRepository. Я создаю объект пользователя и прикрепляю к нему объект Role перед сохранением.
Я получаю следующее сообщение об ошибке на сохранение пользователя в Spring Data JPA:
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.entity.impl.RoleDataImpl; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.entity.impl.RoleDataImpl
.
.
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.wehub.entity.impl.RoleDataImpl
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:765)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:758)
.
.
Когда я извлекаю orphanRemoval и каскады:
@OneToMany(targetEntity = RoleDataImpl.class)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_role_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
Я получаю DataIntegrityException (первый объект сохраняет нормально). Поскольку role_id в таблице user_roles будет иметь уникальное ограничение. Но я хочу, чтобы записи user_roles были удалены при удалении пользователя. Пожалуйста помоги.