2015-02-05 70 views
3

請幫助我瞭解我錯在哪裏。 我有三個表:JPA。多對多創建重複行

表祝願

CREATE TABLE WISHES(
    wish_id bigint default nextval('wish_id_inc'::regclass), 
    target text not null, 
    PRIMARY KEY(wish_id) 
) 

table標籤

CREATE TABLE TAGS(
    tag character varying(255) not null, 
    PRIMARY KEY(tag) 
) 

表Wish_tags

CREATE TABLE wish_tags(
    wish_tags bigint default nextval('wish_tags_id_inc'::regclass), 
    wish_id bigint references wishes(wish_id), 
    tag_id character varying(255) references tags(tag), 
    PRIMARY KEY(wish_tags) 
) 

我創建了這些表兩類:

@Entity 
@Table(name="wishes") 
public class Wish implements Serializable{ 
... 
     @ManyToMany 
     @JoinTable(
      name="wish_tags", 
      joinColumns={@JoinColumn(name="wish_id", referencedColumnName="wish_id")}, 
      inverseJoinColumns={@JoinColumn(name="tag_id", referencedColumnName="tag")}) 
    private List<Tag> tags; 
... 
} 
@Entity 
    @Table(name="tags") 
    public class Tag implements Serializable{ 
     ... 
     @ManyToMany(mappedBy="tags") 
     private List<Wish> whishes; 
     ... 
    } 

當我嘗試創建帶有標籤的願望時,我得到了重複到wish_tags表中。

@Transactional 
public Wish createWish(List<String> tags){ 
//em is EntityManager 
     ArrayList<Tag> ObTags = new ArraList<Tag>(); 
     for(String tagId: tags){ 
      Tag tag = new Tag(tagId); 
      ObTags.add(em.merge(tag)); 
     } 
     Wish wish = new Wish(args1,..., ObTags); 
     em.persist(wish); 
    } 

我做錯了什麼?爲什麼重複被創建?請幫幫我。

+1

您可以在ManyTOMany聲明中使用@Column(insertable = false,updatable = false)屬性。 – AjGupta 2015-02-06 07:16:47

回答

0

對不起,這是我在代碼中的錯誤。我把兩個相同的標籤放在希望的位置。

2

兩個標籤被保存在數據庫中,因爲一個保存在EntityManager.merge(tag)上,另一個在級聯EntityManager.persist(wish)ObTags集合中。

+0

感謝您的回答,但這是我在代碼中的錯誤,我將相同的標籤兩次添加到ObTags。沒有ObTags進入Wish的任何級聯。我可以如果我沒有指定任何級聯,那麼休眠不應該保存ObTags。這是真的? – Putin 2015-02-16 11:34:54

+0

是的,默認的多對多級聯選項是真的 – 2015-02-16 13:16:47