表: Role
@ManyToMany()
@JoinTable(name = "T_Role_Staff")
private Set<Staff> staffs = new HashSet<Staff>();表: Staff
@ManyToMany(mappedBy = "staffs", cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
private Set<Role> roles = new HashSet<Role>();客户端代码:
// 添加雇员及权限Staff s1 = new Staff("danielle");
Staff s2 = new Staff("alven");Role r1 = new Role("role1");
Role r2 = new Role("role2");s1.getRoles().add(r1);
s1.getRoles().add(r2);s2.getRoles().add(r1);
s2.getRoles().add(r2);这样添加两个雇员进数据库后 , Role 表的数据重复了,要怎么解决啊

解决方案 »

  1.   

    多对多是要有中间表的,需要有一个@jointable这样的注释来申明,可能拼写不正确,但是,不管是不是EJB或者在任何项目应用过程中,多对多应该化成两个一对多的关系进行处理的,需要有一个中间表,来表明employ和role之间的关系.
      

  2.   

    表: Role 
    @ManyToMany(mappedBy = "roles") 
    @JoinTable(name = "T_Role_Staff") 
    private Set <Staff> staffs = new HashSet <Staff>();  表: Staff 
    @ManyToMany( cascade = { CascadeType.ALL }, fetch = FetchType.EAGER) 
    private Set <Role> roles = new HashSet <Role>(); 
    表结构你改一下,按照上面试一试,把维护端改为staff应该可以了。如果维护端是role即使记录插入了,但是他们的关联还是没有插入表的。
      

  3.   

    我改成这样,Role 表还是会重复,中间表(t_role_staff)有数据表: Role 
    @ManyToMany(mappedBy = "roles") 
    private Set <Staff> staffs = new HashSet <Staff>(); 表: Staff 
    @ManyToMany( cascade = { CascadeType.ALL }, fetch = FetchType.EAGER) 
    @JoinTable(name = "T_Role_Staff")                      
    private Set <Role> roles = new HashSet <Role>(); 
      

  4.   

    我提供一个我的ManyToMany的配置例子吧,
    一个博客,可以有多个附件,反过来,也允许一个附件属于多个博客(共享)
    博客表:T_BLOG 主键ID
    中间表:T_BLOG_ATTACHMENT( BLOGID,ATTACHMENT_ID) 就2个字段做联合主键
    附件表:T_ATTACHMENT 主键ID
      @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
      @JoinTable(name = "T_BLOG_ATTACHMENT", joinColumns = @JoinColumn(name = "BLOG_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ATTACHMENT_ID", referencedColumnName = "ID"))
      private List<Attachment> attachments;