Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring security, mapping User и Role


Автор: 4epT 17.5.2011, 10:30
Доброе утром всем) Делаю авторизацию на сайте через Spring Security. Класс отвечающий за авторизацию написал ... возникли небольшие проблемы с мапингом. Сейчас сделано вот так:

Код

public class User {

....

@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

@OneToMany(cascade=ALL, targetEntity=Roles.class, mappedBy="user", fetch=FetchType.EAGER )
private List<Role> roles;

...
}


Код

public class Roles{

....

@ManyToOne
@JoninColumn(name="user_id")
private User user;

}


Данный вариант не работает, ругается что не правильный маппинг. Подскажите где я ошибся =)

И еще есть вариант переписать с использованием @CollectionOfElements. То есть будет как то так:

Код

public class User{

...

@CollectionOfElements
public List<Role> getRoles(){

return roles;

}
}


Код


@Embeddable
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "role", propOrder = {
    "role", "title"
})
public class Role{

private String role;
private String title;
}


Какой вариант предпочтительней ? Может у кого то есть уже готовые "красивые" варианты ?) буду благодарен!





Автор: MisterCleric 17.5.2011, 10:44
Привет. 
Вообще мепинг у тебя однозначно не правильный должно быть так:
Код

@Entity
public class User {

 @ManyToMany
    @JoinTable(name = "USERROLELINK",
            joinColumns = @JoinColumn(name = "USERID"),
            inverseJoinColumns = @JoinColumn(name = "ROLEID"))
    private List<Role> roles;

}


Т.е. у тебя есть еще третья таблица, которая хранит связь user-roles.
Ведь может же один user иметь несколько ролей. И с другой стороны - одной роли могут принадлежать несколько users. 

Автор: 4epT 17.5.2011, 11:02
Во, то что нужно ... у меня структура БД была изначально так и построена ... через таблицу RoleCasts были связаны роли и юзеры, но не знал то можно делать такой мапинг. 
Единственное хотелось бы уточнить...
Цитата

@Entity
public class User {
 @ManyToMany
    @JoinTable(name = "USERROLELINK",
            joinColumns = @JoinColumn(name = "USERID"),
            inverseJoinColumns = @JoinColumn(name = "ROLEID"))
    private List<Role> roles;
}



Тут @JoinTable(name = "USERROLELINK" - это имя энтити которое отвечает за связь, следующие два параметра "USERID" и "ROLEID" - это поля из того самого энтити. Я правильно понял ?

Если не сложно приведи пожалуйста мапинг таблицы USERROLELINK и Role =)

Автор: MisterCleric 17.5.2011, 11:06
В том той дело, что меппинга таблицы USERROLELINK у меня нет. 
Это в чистом виде реализация в БД связи многие-ко-многим. Она просто содержит внешние ключи на Users & Role, а "USERID" и "ROLEID" это как раз имена этих колонок, которые в свою очередь ссылаются на users.id & role.id соответственно.
Маппинг таблицы Role очень простой: id & name.

Автор: 4epT 17.5.2011, 11:10
Значит мапинг делается только для таблицу User ?

Тогда я вообще не понимаю как вообще хибер вытащит роли для юзера, если нигде не указано что ROLEID как то связано с id из таблицы Role ...

Автор: MisterCleric 17.5.2011, 11:18
Ясно.
Вот такой маппинг:
Код

@Entity
public class Role {
 
@Id
private Long id;

private String name;

}

Автор: 4epT 17.5.2011, 11:22
Это я понял =) спасибо большое) сегодня сделаю так .. =)

А со стороны БД должны быть настроены как то foregin key ?

Автор: MisterCleric 17.5.2011, 11:23
Однозначно должны.
Это же БД. Твоя таблица "многие-ко-многим" должны иметь внешние ключи на те таблицы, которые она связывает

Автор: 4epT 17.5.2011, 11:25
Цитата(MisterCleric @ 17.5.2011,  11:23)
Однозначно должны.
Это же БД. Твоя таблица "многие-ко-многим" должны иметь внешние ключи на те таблицы, которые она связывает

Вот теперь я точно понял как это все работает) спасибо большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)