2017-02-17 18 views
0

Моя таблица user-> role relationship была магически и случайным образом удалена из нее. Мы не можем воспроизвести проблему, но это происходит в производственной среде. Это происходит только в prod, и только, похоже, происходит, когда многие люди используют систему, которая заставляет нас думать, что это проблема параллелизма. Ниже приведено мое определенное отображение.Слитки Hibernate JoinTable случайно удаляются как-то

У нас есть только несколько мест, которые изменяют пользователей или роли. Ни одно из этих мест не вызовет проблемы! Кроме того, никакая другая система не работает с базой данных.

  1. Вход в систему сохраняет пользователя, чтобы установить дату последнего входа в систему или заблокировать их, если они ошибочно вошли в систему слишком много раз.
  2. Управление пользователями - изменение пользователя и назначение ролей. Это может добавлять или удалять роли из отношения, но выполнение любого действия не приводит к возникновению проблемы.
  3. Управление ролями - создание или редактирование роли, но вы не можете назначать пользователей ролям в этом интерфейсе.
  4. Пользователи могут изменять свой пароль, что приводит к экономии их записи пользователя

//User.java

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "user_roles", joinColumns = { 
@JoinColumn(name = "user_id", referencedColumnName = "id") }, 
      inverseJoinColumns = {@JoinColumn(name = "role_id") }) 
public Set<Role> getRoles() { 
    return this.roles; 
} 

//Role.java

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles") 
public Set<User> getUserRoles() { 
    return this.userRoles; 
} 
+0

Я по-прежнему получаю случайные удаления, к сожалению ... – chrislhardin

ответ

2

Основываясь на вашем описание, вы должны, вероятно, удалить пул столбцов соединения на Role и просто указать, что @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles").

Таким образом, вы не позволяете отношениям управляться обеими сторонами независимо друг от друга, что может быть причиной того, почему вы видите эту проблему.

Это не имеет ничего общего с параллелизмом, но неправильным отображением того, кто владеет отношениями между пользователями и ролями. Прямо сейчас ваши сопоставления утверждают, что обе стороны владеют им, поэтому изменение Role может иметь непреднамеренные последствия.

+0

Я пересмотрел приведенный выше код, чтобы отразить изменения, которые вы предложили, но я все равно получаю случайные удаления и не могу понять, что их вызывает. Ваш подход по-прежнему остается лучшим, но у меня все еще есть что-то неправильное. – chrislhardin

+0

Можете ли вы включить те места, где вы манипулируете объектами User и Role в своем вопросе, чтобы, возможно, мы могли бы помочь дальше. Без него его очень сложно помочь, потому что мы решили проблему с отображением. – Naros

+0

Это оказалось неясное место, где я удалял коллекции от лица до передачи его конвертеру Джексона. Hibernate решил сохранить это изменение, поскольку оно было в контексте сеанса. Потребовалось много времени и много регистрации, чтобы отслеживать. – chrislhardin