2013-08-20 2 views
0

Возможно, кто-то здесь может дать мне совет, где может быть расположена ошибка (JSF 2.2, GlassFish, 4,0):@ManyToMany нет записей в таблице ссылок

  • У меня есть два объекта с manytomany соотношения (смотрите пример)
  • Когда я раскрываю свой проект в GlassFish все таблицы (также связующая таблица) генерируются правильно (создать столы включены в persistence.xml): TAGUSERWISH, TAGUSERWISH_WISH (соединение таблицы), ЖЕЛАЕМ
  • Когда я исполняю сохраняться (см. пример) сущность «пожелание» и «tagUserWish» сохраняется правильно, но ничего не записывается в таблицу ссылок, когда я смотрю прямо i в таблицу 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 + " ]"; 
    } 

} 

Entity 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

Спасибо. Именно там была ошибка. Но, возможно, я могу задать еще один вопрос для лучшего понимания. Впоследствии я попытался отметить объект 'TagUserWish'' @ManyToMany (mappedBy = "tags") 'и сущность' Wish' с '@ManyToMany (cascade = {CascadeType.ALL}) 'потому что таким образом сохранение будет меньше кода, как в моем примере. Но это не сработало. 'WISH_TAGUSERWISH' был создан, но ничего не было вставлено. Разве это не работает? – timmornYE

Смежные вопросы