2015-02-05 2 views
3

, пожалуйста, помогите мне понять, где я был неправ. У меня есть три таблицы:JPA. Многие для многих создают дублированные строки

Таблица Желает

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

Таблица TAGS

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

Вы можете использовать свойство @Column (insertable = false, updatable = false) в любом из объявлений ManyTOMany. – AjGupta

ответ

0

Извините, ребята, это была моя ошибка в коде. Я дважды добавлял те же теги в желание.

2

Два тега сохраняются в БД, поскольку один сохраняется на EntityManager.merge(tag), а другой на каскаде EntityManager.persist(wish) - ObTags.

+0

Спасибо за ответ, но это была моя ошибка в коде, я дважды добавлял те же теги в ObTags. В «Желаниях» нет никакого каскада для ObTags. Как я могу Если я не укажу каскад, тогда hibernate не должен сохранять ObTags. Это правда? – Putin

+0

Да, для опции каскада «много-во-многих» по умолчанию это правда –

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