0

おそらく、ここの誰かがエラーがどこにあるのかヒントを教えてくれます (JSF 2.2、Glassfish 4.0):

  • 多対多関係を持つ 2 つのエンティティがあります (例を参照)
  • プロジェクトをグラスフィッシュにデプロイすると、すべてのテーブル (リンク テーブルも) が正しく生成されます (persistence.xml でテーブルの作成が有効になっています): TAGUSERWISH、TAGUSERWISH_WISH (リンク テーブル)、WISH
  • 永続化を実行すると (例を参照)、エンティティ "wish" と "tagUserWish" は正しく永続化されますが、mysql テーブルを直接調べても、リンク テーブルには何も書き込まれません。List<TagUserWish>しかし、 JPAで「願い」を読み上げると、
  • 新しいセッションが開始された直後 (再デプロイ)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