Контейнер управляемой безопасности в Glassfish - PullRequest
1 голос
/ 20 января 2012

Я прошел этот блог-урок и успешно получил его на работу: http://jugojava.blogspot.com/2011/02/jdbc-security-realm-with-glassfish-and.html

Я назвал две мои сущности Group и User. Они имеют двунаправленное отношение «многие ко многим». Теперь причина, по которой я сделал это, как в блоге, заключается в том, что я делаю страницу администратора, на которой я хочу иметь возможность добавлять новых пользователей. Я также предоставляю пользователям возможность самостоятельно регистрироваться, и они будут иметь роль user.

    @Entity
    public class Group implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String groupName;

        @ManyToMany
        @JoinTable(joinColumns = {@JoinColumn(name="group_id")}, inverseJoinColumns = {@JoinColumn(name="user_id")})
        private List<User> users;

       ....

}

и

    @Entity
    @Table(name = "app_user")
    public class User implements Serializable {

        public static final String ALL = "User.all";

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String firstName;
        private String lastName;
        private Integer age;
        private String username;
        private String email;
        private String password;

        @ManyToMany(mappedBy = "users")
        private List<Group> groups;

        ....
}

У меня вопрос, как я мог бы назначить группу user пользователю, когда он регистрируется, без того, чтобы я выбирал группы из списка в представлении?

Это то, что я сделал в коде приложения, но он связывает код с идентификатором группы в базе данных, есть ли лучшие способы?

Метод из EJB

public void persistAsUser(User user) {
    Group group = new Group(2L, "user");
    user.addGroup(group);

    userRepository.persist(user);
}

1 Ответ

0 голосов
/ 20 января 2012

Возможно, вы захотите определить УНИКАЛЬНЫЙ индекс для поля groupName. Затем создайте объект доступа к данным для таблицы Group, который предоставляет метод для получения группы из groupName (код не тестировался):

public class GroupDAO implements Serializable {
    @PersistenceContext private EntityManager em;
    public Group findByGroupName(String groupName) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Group> cq = cb.createQuery(Group.class);
        Root<Group> group = cq.from(Group.class);
        cq.where(cb.equal(group.get(Group_.groupName), groupName));
        TypedQuery<Group> q = em.createQuery(cq);
        return q.getSingleResult();
    }
}

Если вам не нравится Criteria Builder, вы можете использовать именованный запрос. Добавьте эту аннотацию к вашему классу группы:

@NamedQuery(name = "Group.findByGroupname", query = "SELECT f FROM group f WHERE f.groupname = :groupname")

и создайте именованный запрос следующим образом:

return em.createNamedQuery("Group.findByGroupname").setParameter("groupname", groupName).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...