Glassfish中的容器管理安全性

时间:2012-01-20 18:16:48

标签: java java-ee jpa

我已按照此博客教程成功完成了它的工作: http://jugojava.blogspot.com/2011/02/jdbc-security-realm-with-glassfish-and.html

我已将我的两个实体命名为GroupUser。它具有双向的多对多关系。 现在我在博客中完成它的原因是因为我正在建立一个管理员页面,我希望能够添加新用户。我还让用户有机会自己注册,他们将拥有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分配给用户?

这是我在应用程序代码中所做的,但它将代码绑定到数据库中组的id,有更好的方法吗?

来自EJB的方法

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

    userRepository.persist(user);
}

1 个答案:

答案 0 :(得分:0)

您可能希望在字段groupName上定义UNIQUE索引。然后,为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();