我已按照此博客教程成功完成了它的工作: 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
分配给用户?
这是我在应用程序代码中所做的,但它将代码绑定到数据库中组的id,有更好的方法吗?
来自EJB的方法
public void persistAsUser(User user) {
Group group = new Group(2L, "user");
user.addGroup(group);
userRepository.persist(user);
}
答案 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();