У меня есть объект, который ссылается на список типов enum. Список хранится в базе данных следующим образом:
userName role
-----------------------
user0001 role1
user0001 role2
user0001 role3
user0002 role1
Соответствующий класс Java примерно такой:
@Entity
@Table(name = "UserTable")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userId")
private Integer id;
@Column(name = "user_name")
private String userName;
@ElementCollection(targetClass = Role.class)
@CollectionTable(name = "User_Roles")
@Column(name = "role")
@Enumerated(EnumType.STRING)
private List<Role> roles;
}
Я проверил этот и этот вопрос для сопоставления. Тем не менее у меня есть две проблемы. Первая проблема заключается в том, что userName
- это не PK в моем UserTable
, и, насколько я знаю, hibernate присоединяется к PK.
Вторая проблема - это ошибка с текущей настройкой:
org.hibernate.LazyInitializationException: не удалось лениво инициализировать
коллекция ролей:
com.project.Common.User.roles, не удалось инициализировать
прокси - без сеанса
Эта ошибка должна быть исправлена загрузкой EAGER
, но, когда я попробовал ее, я получил следующую ошибку при запуске:
java.lang.IllegalStateException: попытка зарегистрировать несколько SQL
псевдонимы таблиц [role1_, role2_ и т. д.] для пространства запросов
uid []
Что мне нужно изменить, чтобы это отображение работало?
Обратите внимание, что я не хотел бы вносить какие-либо изменения в базу данных, если это возможно.
Кроме того, я думаю, что на самом деле мне нужно было бы перейти с FetchType.EAGER
, так как на данный момент я запрашиваю базу данных только один раз, и мне потребуется также получить роли для последующего использования. Конечно, я мог бы также изменить способ, которым мое приложение обрабатывает это, и снова запрашивать роли, когда они мне нужны явно, хотя я не уверен, что этот способ будет лучше.