Orika Bean Mapper Spring Data Переопределение таблицы присоединения ManyToMany

В моем проекте Spring у меня есть домен и модель слоя отдельно. Слой домена - это просто сущности, которые отображаются в таблицы в MySQL db. Модели используются в сервисном слое. У меня есть две таблицы: пользователь и роли, которые имеют отношения ManyToMany.

@Entity
@Table(name = "user")
public class UserEntity {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToMany(mappedBy="users", cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    private List<RoleEntity> roles;
//..Getters Setters
}

@Entity
@Table(name = "role")
public class RoleEntity {
    @Id
    @GeneratedValue
    private Long id;
    private String value;
    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    @JoinTable(name = "user_role",
    joinColumns = @JoinColumn(name = "role_id") , inverseJoinColumns = @JoinColumn(name = "user_id") )
    private List<UserEntity> users;
}

модель

public class User {
    private Long id;
    private String name;
    private List<Role> roles;
}

public class Role {
    private Long id;
    private String value;
    private List<User> users;
}

Слой репозитория

@Repository
public interface UserRepo extends JpaRepository<UserEntity, Long>{

}

обслуживание

@Service
public class UserService {
    @Autowired
    private UserRepo userRepo;

    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    MapperFacade mapper = mapperFactory.getMapperFacade();

    public void save(User user) {
        userRepo.save(mapper.map(user, UserEntity.class));
    }

    public User getUser(Long id) {
        return mapper.map(userRepo.findOne(id), User.class);

    }
}

Проблема в том, что каждый раз, когда я получаю пользователя и обновляю его свойства (например, имя), а затем сохраняю его обратно в таблицу, строка в соединительной таблице user_role также переопределяет. Например, если это было

id = 1, user_id = 1, role_id = 1

, чем после обновления это делается

id=2, user_id=1, role_id=1

,

@Test
    public void contextLoads() {
        User user = userService.getUser(1L);
        user.setName("kyk");
        userService.save(user);
    } 

Он работает корректно без картографа, поэтому картограф является причиной. И я не могу обойтись. Кто-нибудь сталкивался с такой же проблемой? Буду благодарен за любую помощь.

0 ответов

Другие вопросы по тегам