В моем текущем весеннем проекте у меня есть эти классы с атрибутом OneToMany:
@Entity
public class User extends Model implements UserDetails {
...
@OneToMany(fetch = FetchType.EAGER, mappedBy = "role")
@Fetch(FetchMode.SELECT)
@JsonIgnore
private Set<UserRole> roles;
...
}
и
@Entity
public class Role extends Model {
...
@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
@Fetch(FetchMode.SELECT)
@JsonIgnore
private Set<UserRole> user;
...
}
с отношением UserRole, реализованным следующим образом:
@Entity
public class UserRole {
@EmbeddedId
private UserRoleId id;
@ManyToOne
@JoinColumn(name = "fk_user", insertable = false, updatable = false)
private User user;
@ManyToOne
@JoinColumn(name = "fk_role", insertable = false, updatable = false)
private Role role;
@Column
private Date expirationDate;
...
}
данные для класса Role и UserRole вставляются в базу данных через файл data.sql
, включенный в путь к классу приложения (/src/main/resources
):
insert into role (name) values ('role_name');
insert into permission (name) values ('permission_name');
insert into role_permissions values (..., ...);
...
insert into user_role (fk_role, fk_role) values (1,1);
Когда я запускаю приложение, аутентификацияОбъект, управляемый SecurityContext, правильно заполнен разрешениями, связанными с ролями, которые я вставил, что заставляет меня предположить, что все роли правильно вставлены в базу данных.
Но когда я пытаюсь перечислить роли в этом представлении:
@RequestMapping(value = "/roles", method=RequestMethod.GET)
@PreAuthorize("hasPermission(#user, 'consult_'+#this.this.name)")
public String formRoles(Model model, @RequestParam("id") Integer id) {
model.addAttribute("command", serv.findBy("id", id));
return "form_roles";
}
html:
<strong>roles</strong>
<p th:text="${#sets.size(command.roles)}"></p>
<ul>
<li th:each="c : ${command.roles}" th:text="${c}"></li>
</ul>
перечислены только одна роль, вместо всех 9 я вставил в файл data.sql
.Кто-нибудь может дать подсказку, что здесь может быть не так?
ОБНОВЛЕНИЕ
мой класс обслуживания:
public E findBy(String key, Object value) {
return dao.findBy(key, value);
}
мой класс дао:
public E findBy(String key, Object value) {
EntityManager entityManager = getEntityManager();
entityManager.getTransaction().begin();
List<E> lista = entityManager.createQuery("SELECT a FROM "+clazz.getSimpleName()+" a WHERE a."+key+" = :value").setParameter("value", value).getResultList();
entityManager.getTransaction().commit();
entityManager.close();
if(!lista.isEmpty())
return (E) lista.get(0);
else
return null;
}