2013-08-20 38 views
0

也许有人在这里可以给我一个提示,其中误差可以位于(JSF 2.2,Glassfish的4.0):@ManyToMany在连接表中没有条目

  • 我有两个实体用多对多关系(见例子)
  • 当我在GlassFish中部署我的项目(也链接表)正确生成所有表(创建的表格中的persistence.xml启用):TAGUSERWISH,TAGUSERWISH_WISH(链接表),祝
  • 当我执行一个坚持(看例子)实体“愿望”和“tagUserWish”被正确保存,但是当我直接看我时没有任何东西写入链接表nto mysql表。但是,当我读到“心愿”出与JPA的List<TagUserWish>充满
  • 只要一个新的会话开始(重新部署)List<TagUserWish>也为空时JPA读出

业主单位:

@Entity 
public class Wish implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String subject; 
    private String abstractT; 

    @OneToOne 
    private User user; 

    @ManyToMany(mappedBy = "wishes", cascade = {CascadeType.ALL}) 
    private List<TagUserWish> tags = new LinkedList<>(); 

    public void addTag(TagUserWish tag){ 
     tags.add(tag); 
    } 

    public void setTags(List<TagUserWish> tags) { 
     this.tags = tags; 
    }  

    public void removeTag(TagUserWish tag){ 
     tags.remove(tag); 
    } 

    public List<TagUserWish> getTags(){ 
     return tags; 
    } 

    public String getSubject() { 
     return subject; 
    } 

    public void setSubject(String subject) { 
     this.subject = subject; 
    } 

    public String getAbstractT() { 
     return abstractT; 
    } 

    public void setAbstractT(String abstractT) { 
     this.abstractT = abstractT; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Wish)) { 
      return false; 
     } 
     Wish other = (Wish) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "eu.citato.main.model.Wish[ id=" + id + " ]"; 
    } 

} 

实体2:

@Entity 
public class TagUserWish implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;   
    private String name; 

    public TagUserWish() { 
    }   

    public TagUserWish(String name) { 
     this.name = name; 
    }   

    @ManyToMany 
    private List<Wish> wishes = new LinkedList<>(); 

    public void addWish(Wish wish){ 
     wishes.add(wish); 
    } 

    public void setWishes(List<Wish> wishes) { 
     this.wishes = wishes; 
    }  

    public void removeWish(Wish tag){ 
     wishes.remove(tag); 
    } 

    public List<Wish> getWishes(){ 
     return wishes; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof TagUserWish)) { 
      return false; 
     } 
     TagUserWish other = (TagUserWish) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "eu.citato.main.model.Tag[ id=" + id + ", name="+name+" ]"; 
    }  
} 

我如何坚持它:

@javax.inject.Named 
@SessionScoped 
public class WishPM implements Serializable { 

    @EJB 
    private WishService wls; 

    public void commitEditWish(){   
     List<TagUserWish> selTags = new ArrayList<>(); 
     selTags.add(new TagUserWish("Tag1")); 
     selTags.add(new TagUserWish("Tag2")); 
     currentWish = new Wish(); 
     currentWish.setSubject("wishSubject"); 
     currentWish.setAbstractT("wishAbstract"); 
     currentWish.setTags(selTags); 
     wls.createWish(currentWish); 
    } 
} 

与志愿服务:

@Stateless 
public class WishService implements Serializable{ 

    @PersistenceContext(unitName = "WishlistPU") 
    private EntityManager em; 

    public void createWish(Wish entity){ 
     em.persist(entity); 
    } 
} 

回答

1

关系是基于以关系的业主方坚持。双向关系的所有者是在反面的mappedBy的值。在下面的关系的情况下,所有者是wishes领域TagUserWish实体

@ManyToMany(mappedBy = "wishes", cascade = {CascadeType.ALL}) 
private List<TagUserWish> tags = new LinkedList<>(); 

由于TagUserWish实例确实有空wishes集合,关系不持久。问题可以通过添加相关的希望例如TagUserWish来解决,例如如下:

... 
TagUserWish tuw1 = new TagUserWish("Tag1") 
TagUserWish tuw2 = new TagUserWish("Tag2") 

selTags.add(tuw1); 
selTags.add(tuw2); 

currentWish = new Wish(); 
tuw1.addWish(currentWish); //setting to owner side of relationship 
tuw2.addWish(currentWish); //setting to owner side of relationship 
... 
+0

谢谢。这正是错误所在的地方。但是也许我可以再问一个问题以便更好地理解:随后,我尝试用@ManyToMany(cascade = {CascadeType.ALL})标记实体'TagUserWish'和@ManyToMany(mappedBy =“tags”)'和实体Wish。 )'因为这种方式持久会少一些代码,就像我的例子。但是这不起作用。 “WISH_TAGUSERWISH”已创建,但没有通过持续插入。不应该这样工作吗? – timmornYE