【问题标题】:Container managed security in GlassfishGlassfish 中的容器管理安全性
【发布时间】:2012-01-20 18:16:47
【问题描述】:

我遵循了这个博客教程并成功地让它工作: 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);
}

【问题讨论】:

    标签: java jakarta-ee jpa


    【解决方案1】:

    您可能希望在字段 groupName 上定义唯一索引。然后,为 Group 表创建一个 Data Access Object,它提供了从 groupName 获取 Group 的方法(代码未测试):

    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();
    

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2016-08-15
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多