Атрибут OneToMany не возвращает все элементы своего набора - PullRequest
0 голосов
/ 12 февраля 2019

В моем текущем весеннем проекте у меня есть эти классы с атрибутом 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;
  }

1 Ответ

0 голосов
/ 12 февраля 2019

Вы пытались установить для журналов sql значение true и посмотреть, какой запрос выполняется, попробуйте выполнить тот же запрос из клиента БД.Какую БД вы используете?

Ваш класс DAO, почему он возвращает элемент вместо списка, полученного из кода, приведенного ниже.

public E findBy(String key, Object value) 


List<E> lista = entityManager.createQuery("SELECT a FROM "+clazz.getSimpleName()+" a WHERE a."+key+" = :value").setParameter("value", value).getResultList();
entityManager.getTransaction().commit();

Извините, у меня недостаточно повторений, чтобы добавить этов качестве комментария.

...