Я использую эти две сущности для создания нового пользователя и связанных с ним групп:
@Entity
@Table(name="usertable")
@SuppressWarnings("serial")
@Searchable
public class User implements Serializable {
@GeneratedValue(generator="userIdSeq")
@SequenceGenerator(name="userIdSeq", sequenceName="usertable_id_seq")
@SearchableId
@Id
int id;
@SearchableProperty
String userId; // 'Unique identifier. It is formed using this fashion: ''prefix:identifier''
String userName; // Name used to log in the application.
String email; // User's email
@ManyToMany
@JoinTable( name="usergroup",
joinColumns=@JoinColumn(name = "userid", referencedColumnName="userId"),
inverseJoinColumns=@JoinColumn(name = "groupid")
)
List<Group> groups;
...
}
// Group
@Entity
@Table(name="grouptable")
public class Group implements Serializable {
@Id
String groupId // Unique identifier for group.
String description // Brief text describing the group purposes.
@ManyToMany(mappedBy="groups")
@Cascade(SAVE_UPDATE)
List<User> users
....
}
В базе данных:
usertable (id, userId, name)
групповая таблица (идентификатор, описание)
группа пользователей (идентификатор пользователя, идентификатор группы, ключ группы)
Очень приятно добавлять группу в список групп, вызывать метод сохранения для пользователя и смотреть в спящем режиме сохранение пользовательской группы вместе. Однако у меня есть большая проблема, связанная с автоматическим удалением записи в спящем режиме из таблицы групп пользователей при извлечении пользователя после операции сохранения (пользователя).
Вот тестовая последовательность, которая генерирует удаление группы пользователей
- сохранить нового пользователя
- сохранить новую группу
- И группу к списку в пользователе
- сохранить пользователя
- получить пользователя из электронной почты
@Test
@Transactional
public void testGetUserByEmail(){
Session session = factory.getCurrentSession();
String email = "sarah.silverman@comedycentral.com";
User user = createUser();
user.setWeCanContact(true);
user.setPartnersCanContact(false);
user.setAgreedTerms(false);
user.setReferer("Laura");
String groupId = "AARP";
String description = "Appletalk Address Resolution Protocol";
Group group1 = new Group();
group1.setGroupId(groupId);
group1.setDescription(description);
session.save(group1);
session.flush();
user.getGroupLists().add(group1);
session.saveOrUpdate(user);
User testUser = userRepository.getUserByEmail(email);
assertNotNull(testUser);
assertEquals("It's not the correct email", email, testUser.getEmail());
}
private User createUser(){
Session session = factory.getCurrentSession();
String userId = "UB:2010";
String userPassword = "sarah";
String realName = "Sarah Silverman";
String email = "sarah.silverman@comedycentral.com";
User user = new User();
user.setUserId(userId);
user.setUserName(email);
user.setUserPassword(userPassword);
user.setRealName(realName);
user.setEmail(email);
List<Group> emptyGroupLists = new ArrayList<Group>();
user.setGroupLists(emptyGroupLists);
Group group = new Group();
group.setGroupId("ABC");
group.setDescription("A for apple");
user.getGroupLists().add(group);
session.save(group);
session.save(user);
session.flush();
return user;
}
// Repository Method to get user from email
//
// @NamedQuery(name="user.findByEmail",
// query="SELECT u FROM User u " +
// "LEFT JOIN FETCH u.groupLists " +
// "WHERE upper(u.email) = :email")
public User getUserByEmail(String email) {
Session session = sessionFactory.getCurrentSession();
Query query = session.getNamedQuery("user.findByEmail");
query.setParameter("email", email.toUpperCase());
User user = (User)query.uniqueResult();
return user;
}
Перед выполнением шага 5, группа пользователей с автоматически удаляется как
// вывод SQL
Hibernate:
delete
from
usergroup
where
userid=?
Несколько вещей, которые я должен отметить;
1. ИД пользователя не является ПК пользователя. Будет ли это проблемой?
2. Отображение manyTomany в группе пользователей, сопоставленных по userid и groupid
3. Это происходит не только в тесте. Он тоже в разработке.
Как мне остановить автоматическое удаление группы пользователей. Группа пользователей является очень важной таблицей и не должна быть удалена. Любая помощь приветствуется. Спасибо.