0

也许这里有人可以给我一个提示错误可能位于的位置(JSF 2.2,Glassfish 4.0):

  • 我有两个具有多对多关系的实体(参见示例)
  • 当我在 glassfish 中部署我的项目时,所有表(也是链接表)都会正确生成(在 persistence.xml 中启用创建表):TAGUSERWISH、TAGUSERWISH_WISH(链接表)、WISH
  • 当我执行持久化(参见示例)实体“wish”和“tagUserWish”时,会正确持久化,但是当我直接查看 mysql 表时,没有任何内容写入链接表。但是当我用 JPA 读出“wish”时,它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);
    }
}
4

1 回答 1

1

关系基于关系的所有者方而持久化。双向关系的所有者是mappedBy反面值的所有者。在以下情况下,关系的所有者是实体中的wishes字段TagUserWish

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

因为实例TagUserWish确实有空wishes集合,所以关系不会持久。可以通过在 的实例中添加相关的 Wish 来解决问题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
...
于 2013-08-20T16:32:03.623 回答