2013-08-20 40 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