Таблица может иметь несколько ключей. Сделайте электронную почту ключом кандидата. Мне нравится думать о ПК, как о баллотировании в президенты США. У вас есть несколько кандидатов, но только 1 может быть президентом.
То, что сказали другие, хорошо. Если значение меняется, вам не нужно обновлять 30 других таблиц. Это благоприятствует суррогатному ключу (ключу, который не имеет никакого значения, кроме идентификации строки). Поскольку суррогаты не имеют значения, вам не нужно беспокоиться об изменении их стоимости. Обычно это целое число с автоинкрементом.
Возвращение точки оригинала. Ваш код:
User selected = em.find(User.class, userEmail);
Этот код должен быть совершенно действительным, независимо от того, является ли электронная почта первичным ключом или ключом-кандидатом. Если ваш фреймворк ТРЕБУЕТ поиска по первичным ключам, вам лучше запустить screaming, потому что в реальном мире вы ищете гораздо больше, чем просто PK.