我已遵循此博客教程并成功使其正常工作: 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
分配给用户,而不需要我从 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/