java - Glassfish 中的容器管理安全性

标签 java jakarta-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 分配给用户,而不需要我从 View 的列表中选择组?

这是我在应用程序代码中所做的,但它绑定(bind)了数据库中组的ID的代码,有更好的方法吗?

来自 EJB 的方法

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

    userRepository.persist(user);
}

最佳答案

您可能想要在字段 groupName 上定义一个 UNIQUE 索引。然后,为Group表创建一个数据访问对象,它提供了从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();
    }
}
<小时/>

如果您不喜欢条件生成器,您可以使用命名查询。将此注释添加到您的组实体类中:

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

并按如下方式构建命名查询:

return em.createNamedQuery("Group.findByGroupname").setParameter("groupname", groupName).getResultList();

关于java - Glassfish 中的容器管理安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8945978/

相关文章:

java - 在 Clojure 中 : Error executing a Java call with let inside a function but not in REPL

eclipse - 请求的资源不可用。 Apache Tomcat/7.0.42

java - 是否存在将 @Transactional 放入仅检索数据的方法的情况?

java - JPA:JQL 和 SQL 的区别

php - 无法使用 Spring Boot 从 phpmyadmin SQL 获取数据

java - Android - 更改应用程序签名( keystore + key )

java.sql.SQLException : No suitable driver found for localhost

java - 错误: cannot access Filter

java - 使用 JTA 不会回滚 Jackrabbit 数据存储中的数据

java - Spring HATEOAS 与 Spring Data Rest