2016-12-26 2 views
0

Я реализующий однонаправленный 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 были удалены при удалении пользователя. Пожалуйста помоги.

ответ

1

Послание за исключением говорит вам, что это не так: отдельностоящий объект передается упорствовать: com.entity.impl.RoleDataImpl это означает, что ваш экземпляр User содержит ссылку на Role, который, в свою очередь, не удалось вашим EntityManager ,

Он должен работать так:

Role detachedEntity = ...; // from somewhere else 

// obtain a managed entity 
// e.g. by name, use what you have at your disposal preferably the ID 
Role managedEntity = roleRepository.findByName(detachedEntity.getName()); 

// assuming you'd initialize a new User like so: 
User newUser = new UserDataImpl(); 
newUser.addRole(managedEntity); 

userRepository.save(newUser);