Hibernate не обновляет сущность слиянием или обновлением - PullRequest
2 голосов
/ 22 апреля 2019

У меня есть класс User и UserRole.Я хочу удалить роль из пользователя и обновить ее.

это мой метод deleteRole:

public void deleteRole(String username, String role) {
     User user = userDao.findByUserName(username);
            Set<UserRole> userRoles = user.getUserRole();
            for (UserRole tempRole: userRoles) {
                if (tempRole.getRole().equals(role)){
                    userRoles.remove(tempRole);
                }
            }
            user.setUserRole(userRoles);
      updateUser(user);
}

вот мой метод updateUser:

 public void update(User user) {
       sessionFactory.getCurrentSession().merge(user);
    }

Я пыталсяобновление, объединение, saveOrUpdate, но ничего не меняется.У меня все еще есть те же роли.

сущность пользователя

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @Column(name = "USERNAME", nullable = false, unique = true)
    private String username;

@Column(name = "PASSWORD", nullable = false)
private String password;

@Transient
private String confirmPassword;

@Column(name = "ENABLED", nullable = false)
private boolean enabled = true;

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

вот сущность userRole

@Entity
@Table(name = "USER_ROLES", uniqueConstraints = @UniqueConstraint(
        columnNames = { "ROLE", "USERNAME" }))
public class UserRole {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "user_role_id",
            unique = true, nullable = false)
    private Integer userRoleId;

    @Column(name = "ROLE")
    private String role;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;

ОБНОВЛЕНИЕ Когда я удаляю рольот пользователя и объединить его, а затем попытаться получить userByUsername из базы, это показывает, что у этого пользователя нет этой роли, но когда я пытаюсь открыть свою HTML-страницу с пользователями, она снова появляется в списке.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Я добавлю ответ, так как считаю, что вам не хватает сути каскада.

Вы ищете удаление сироты.См. https://www.baeldung.com/delete-with-hibernate

См. Также jpa удаление элемента из списка - синтаксис отличается в более старых версиях Hibernate и Jpa 2.0

Кроме того, вы полагаетесь на jdbc auto-совершать вместо того, чтобы делать ваши методы @Transactional.Таким образом, ваша сущность отсоединяется сразу после ее поиска с помощью find.Затем вы снова присоединяете свою сущность с помощью слияния.Это не имеет никакого смысла.Вдобавок ко всему, Hibernate использует грязную проверку, поэтому вам не нужно выполнять операции в Session для выполнения обновлений.Они будут выполняться, когда сеанс сбрасывается.

Все вышеперечисленное выполняется до тех пор, пока вы хотите положиться на каскад для удаления вашей пользовательской роли.Вы также можете получить тот, который ищете, и использовать Session.remove с UserRole.Вам больше понравится в конечном итоге с выполнением кода Bettr.

1 голос
/ 22 апреля 2019

Разработка моего комментария ранее - я думаю, что вы определили UserRole как владельца отношения (тот, который не аннотирован атрибутом mappedBy!), Поэтому решение для пользователя вместо UserRole для User может решить эту проблему.Попробуйте установить пользователя для требуемой userRole, а не наоборот.

    public void deleteRole(String username, String role) {
    User user = userDao.findByUserName(username);
    Set<UserRole> userRoles = user.getUserRole();
    for (UserRole tempRole: userRoles) {
        if (tempRole.getRole().equals(role)){
            tempRole.setUser(null);
            sessionFactory.getCurrentSession().merge(tempRole);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...