2016-11-20 2 views
0

Пользователь имеет роли и и установил роли:Hibernate @ManyToMany не сохраняет третьей таблицы

Класс пользователя

@Entity 
    @Table(name = "users") 
    public class User extends BaseEntity { 

     @Column(name = "username") 
     private String username; 

     @Column(name = "password") 
     private String password; 

     @Transient 
     private String confirmPassword; 

     @ManyToMany(fetch = FetchType.EAGER) 
     @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), 
       inverseJoinColumns = @JoinColumn(name = "role_id")) 
     private Set<Role> roles = new HashSet<>(); 

     public String getUsername() { 
      return username; 
     } 

     public void setUsername(String username) { 
      this.username = username; 
     } 

     public String getPassword() { 
      return password; 
     } 

     public void setPassword(String password) { 
      this.password = password; 
     } 

     public String getConfirmPassword() { 
      return confirmPassword; 
     } 

     public void setConfirmPassword(String confirmPassword) { 
      this.confirmPassword = confirmPassword; 
     } 

     public Set<Role> getRoles() { 
      return roles; 
     } 

     public void setRoles(Set<Role> roles) { 
      this.roles = roles; 
     } 

     @Override 
     public String toString() { 
      return "User{" + 
        "username='" + username + '\'' + 
        ", password='" + password + '\'' + 
        ", confirmPassword='" + confirmPassword + '\'' + 
        ", roles=" + roles + 
        '}'; 
     } 
    } 

Роль класса

@Entity 
@Table(name = "roles") 
public class Role extends NamedEntity { 

    @ManyToMany(mappedBy = "roles") 
    private Set<User> users = new HashSet<>(); 

    public Set<User> getUsers() { 
     return users; 
    } 

    public void setUsers(Set<User> users) { 
     this.users = users; 
    } 
} 

Столы

-- Table: users 
CREATE TABLE users (
    id  INT   NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    username VARCHAR(255) NOT NULL, 
    password VARCHAR(255) NOT NULL 
) 
    ENGINE = InnoDB; 

-- Table: roles 
CREATE TABLE roles (
    id INT   NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(100) NOT NULL 
) 
    ENGINE = InnoDB; 

-- Table for mapping user and roles: user_roles 
CREATE TABLE user_roles (
    user_id INT NOT NULL, 
    role_id INT NOT NULL, 

    FOREIGN KEY (user_id) REFERENCES users (id), 
    FOREIGN KEY (role_id) REFERENCES roles (id), 

    UNIQUE (user_id, role_id) 
) 
    ENGINE = InnoDB; 

Классы хранилища:

JpaUserRepositoryImpl

@Repository 
@Transactional 
public class JpaUserRepositoryImpl implements UserRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    @Autowired 
    private RoleRepository roleRepository; 

    @Autowired 
    private BCryptPasswordEncoder bCryptPasswordEncoder; 

    public void registerUser(User user) { 
     Session session = this.sessionFactory.openSession(); 

     session.saveOrUpdate(user); 
     session.close(); 

    } 

    public User findUserByUsername(String username) { 
     Session session = this.sessionFactory.openSession(); 

     User user; 
     Query query = session.createQuery("SELECT DISTINCT user FROM User user WHERE user.username LIKE :username"); 
     query.setParameter("username", username + "%"); 
     user = (User) query.getSingleResult(); 
     session.close(); 
     return user; 
    } 

    public User findUserById(Long id) { 
     Session session = this.sessionFactory.openSession(); 
     User user = session.get(User.class, id); 
     session.close(); 

     return user; 
    } 
} 

JpaRoleRepositoryImpl

@Repository 
@Transactional 
public class JpaRoleRepositoryImpl implements RoleRepository { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    public Role findRoleById(Long id) { 
     Session session = this.sessionFactory.openSession(); 
     Role role = session.get(Role.class, id); 
     session.close(); 
     return role; 
    } 

    public Role findRoleByName(String name) { 
     Session session = this.sessionFactory.openSession(); 
     Query query = session.createQuery("SELECT role FROM Role role WHERE role.name =:name"); 
     query.setParameter("name", name); 
     Role role = (Role) query.getSingleResult(); 
     session.close(); 
     return role; 
    } 
} 

UserServiceImpl

@Service 
public class UserServiceImpl implements UserService { 

    @Autowired 
    JpaUserRepositoryImpl userRepository; 

    @Autowired 
    RoleServiceImpl roleRepository; 

    @Autowired 
    BCryptPasswordEncoder bCryptPasswordEncoder; 


    public void registerUser(User user) { 
     user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); 

     Set<Role> roles = new HashSet<>(); 
     roles.add(roleRepository.findRoleById(1L)); 
     user.setRoles(roles); 
     System.out.println(user); 
     userRepository.registerUser(user); 
    } 

    public User findUserByUsername(String username) { 
     User user = userRepository.findUserByUsername(username); 
     return user; 
    } 

    public User findUserById(Long id) { 
     User user = userRepository.findUserById(id); 
     return user; 
    } 
} 

После создания нового пользователя я его пользователей таблицы, но никаких изменений в таблицы user_roles. Не могу понять, почему. Любые идеи? Спасибо.

ответ

0

Здесь вы хотите выполнить операцию вставки таблицы user в User_roles, но вы не указали cascade Стратегия в картографии.

По умолчанию стратегия каскада «нет», то есть никакие изменения не будут распространяться на дочерние таблицы.

Попробуйте применить каскадный вариант в картографии, и он должен работать.

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 

Я использовал CAscadeType.ALL, но вы можете ограничить его только вставкой, обновлением или удалением или любой комбинацией.

+0

К сожалению, проблема не здесь. – Proselyte

+0

Вы получаете какое-либо исключение? совместно использовать SQL-запросы, выполняемые в БД, включив опции show_sql и format_sql в спящем режиме – Ubercool