Hibernate user_roles таблица не будет обновляться при использовании отношения ManyToOne - PullRequest
0 голосов
/ 13 июня 2018

У меня есть 3 таблицы: User, Role и User_role.У пользователя есть отношение OneToMany, отображаемое «пользователем» с помощью CascadeType.Merge, а user_role имеет 2 отношения ManyToOne с cascadeTypes. Все однако user_table никогда не заполняется данными при запуске hibernate.Вместо этого значения заполняются только в таблицах пользователя и роли, но не в таблице user_role.

Определение таблицы пользователя

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="Id", nullable=false, updatable = false)
private Long id;

private String username;
private String password;
private String firstName;
private String lastName;

private String email;
private String phone;
private boolean enabled = true;

@OneToMany(mappedBy = "user", cascade=CascadeType.MERGE, fetch = 
FetchType.EAGER)
@JsonIgnore
private Set<UserRole> userRoles = new HashSet<>();

Таблица UserRole:

@Entity
@Table(name="user_role")
public class UserRole implements Serializable {
private static final long serialVersionUID = 890345L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long userRoleId;

@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL, 
optional=false)
@JoinColumn(name = "user_id")
private User user;

@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL,  
optional=false)
@JoinColumn(name = "role_id")
private Role role;

public UserRole () {}

public UserRole (User user, Role role) {
    this.user = user;
    this.role = role;
}

public long getUserRoleId() {
    return userRoleId;
}

public void setUserRoleId(long userRoleId) {
    this.userRoleId = userRoleId;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}

}

Call TouserRepository.save () в userServiceImpl, который вызывается из RunLine командной строки.

@Service

открытый класс UserServiceImpl реализует UserService {

private static final Logger LOG = LoggerFactory.getLogger(UserSecurityService.class);


@Autowired
private UserRepository userRepository;

@Autowired
private RoleRepository roleRepository;


// Indicates a  Database Transaction
@Transactional
public User createUser(User user, Set<UserRole> userRoles) {
    User localUser = userRepository.findByUsername(user.getUsername());

    if(localUser != null) {
        LOG.info("User with username {} already exist. Nothing will be done. ", user.getUsername());
    } else {


        for (UserRole ur : userRoles) {
            roleRepository.save(ur.getRole());
        }

        Set<UserRole> currentRoles =user.getUserRoles();

        currentRoles.addAll(userRoles);
        user.setUserRoles(currentRoles);


        localUser = userRepository.save(user);
    }

    return localUser;    
}

}

Запуск основного класса ()

    public void run(String... args) throws Exception {
    User user1 = new User();
    user1.setFirstName("John");
    user1.setLastName("Adams");
    user1.setUsername("j");
    user1.setPassword(SecurityUtility.passwordEncoder().encode("p"));
    user1.setEmail("JAdams@gmail.com");
    Set<UserRole> userRoles = new HashSet<>();
    Role role1 = new Role();
    role1.setRoleId(1);
    role1.setName("ROLE_USER");
    userRoles.add(new UserRole(user1, role1));

    userService.createUser(user1, userRoles);
}

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Мне удалось сохранить данные в ассоциативной таблице user_role, реализовав диспетчер сущностей JPA.Был создан новый класс EntityManager, и данные были сохранены с помощью метода javax.persistence .merge ().

0 голосов
/ 13 июня 2018

CascadeType.MERGE будет только каскадные события слияния.События Persist не будут каскадными, поэтому, если вы попытаетесь сохранить нового пользователя, событие Persist не будет каскадно перемещаться в User_role, и в таблицу user_role не будут вставлены никакие записи.

Попробуйте добавить CascadeType.PERSIST или изменить на CascadeType.ALL, чтобы каскадно сохранить запись в базе данных.

@OneToMany(mappedBy = "user", cascade={CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)

Подробнее о событиях Cascade можно узнать в этом ответе.: Что означают REFRESH и MERGE в терминах баз данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...