2016-03-06 3 views
0

Мне нужно аутентифицировать пользователя в своем приложении, но у меня возникают некоторые трудности с отображением @ElementCollection в классе User.Как правильно отобразить набор в стиле pojo для спящего режима?

Я использую пример, найденный на this Spring Security tutorial, чтобы создать мое приложение, поэтому большинство показанных здесь вещей очень похожи на это.

Класс пользователя Set<UserProfile> был первоначально определен как:

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "HRM_USER_USER_PROFILE", 
    joinColumns = { @JoinColumn(name = "USER_ID") }, 
    inverseJoinColumns = { @JoinColumn(name = "USER_PROFILE_ID") }) 
private Set<UserProfile> userProfiles = new HashSet<UserProfile>(); 
// -- getter and setter 

UserProfile класс как:

@Column(name="type", length=15, unique=true, nullable=false) 
    private String type = UserProfileType.USER.getUserProfileType(); 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

И в UserProfileType перечислении как:

USER("USER"), 
DBA("DBA"), 
ADMIN("ADMIN"); 

String userProfileType; 

private UserProfileType(String userProfileType){ 
    this.userProfileType = userProfileType; 
} 

public String getUserProfileType(){ 
    return userProfileType; 
} 

Который уже сохранялось на базы данных, ноКлассне может читать.

EDIT - вставить @ElementCollection часть

@ElementCollection(targetClass = UserProfile.class) 
@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "HRM_USER_USER_PROFILE", 
     joinColumns = { @JoinColumn(name = "id_user") }, 
     inverseJoinColumns = { @JoinColumn(name = "id_profile") }) 
@Column(name = "user_profiles") 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
private Set<UserProfile> userProfiles = new HashSet<UserProfile>(0); 

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

Вместо запуска SQL-скрипта, загружающего UserProfileType, User и их отношения, я использую bean-компонент @PostConstruct для загрузки значений по умолчанию при запуске приложения.

Я ожидал распечатать полную информацию о пользователе, но я не получил информации о профилях пользователей.

Что мне здесь не хватает?

Заранее благодарен!

+0

В опубликованном коде нет ни одного элемента ElementCollection. Что вы делаете, что вы ожидаете, и что происходит вместо этого? «У меня возникают некоторые трудности», это не достаточное описание конкретной проблемы. –

+0

Извините, я забыл опубликовать часть '@ ElementCollection' ... редактирование сейчас. – gtludwig

+0

Почему вы думаете, что вы должны добавить ElementCollection в это сопоставление? Вы читали его javadoc? Вы понимаете, для чего он используется? Чего вы пытаетесь достичь? –

ответ

0

Я думаю, что вам нужно сохранить отображение «Многие ко многим» только в классе «UserProfile», потому что «ElementCollection» используется для объединения элементов, которые не являются сущностями, в вашем случае вы должны использовать « Аннотации CollectionTable.

@ElementCollection 
@CollectionTable(name="HRM_USER_USER_PROFILE", [email protected](name="id_profile")) 
@AttributeOverrides({ 
      @AttributeOverride(name="type", 
          [email protected](name="TYPE")) 
     }) 
private Set<UserProfile> userProfiles = new HashSet<UserProfile>(0); 

«CollectionTable» аннотация указует название вашей коллекции и столбца соединения, после этого «AttributesOverrides» аннотация установить столбцы, которые являются частью вашей коллекции, в этом случае, я просто поставил «Type» , но вы можете добавить больше.

... 
@AttributeOverrides({ 
    @AttributeOverride(name="type", [email protected](name="TYPE")), 
    @AttributeOverride(name="otherColumn", [email protected](name="OTHER_COLUMN")) 
}) 
... 

Надеюсь, эта информация поможет вам.

Удачи.

Смежные вопросы