2012-01-20 217 views
1
管理安全

我按照這個博客教程,併成功地得到它的工作: http://jugojava.blogspot.com/2011/02/jdbc-security-realm-with-glassfish-and.html集裝箱Glassfish的

我有一個名爲我的兩個實體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); 
} 

回答

0

您可能要定義的字段組名UNIQUE索引方法。然後,創建組表,它提供了從組名獲得一組的方法(代碼未測試)數據訪問對象:

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

如果你不喜歡標準Builder,可以使用命名查詢。這個註釋添加到您的組實體類:

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

,並建立一個命名查詢,如下所示:

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