2015-12-24 2 views
0

Я думаю, что это очень распространенная проблема, с сохранением нового юридического лица с exisitng субъектов (@ManyToMany отношения)Spring Data @ManyToMany обновление и создать объект

Place модели

@Entity 
@Table(name = "places") 
public class Place implements Serializable { 

    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Id 
    @Getter 
    private Long id; 

@Getter 
    @Setter 
    @ManyToMany(mappedBy = "places", cascade = {CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH}) 
    private Set<Tag> tags = new HashSet<>(); 
} 

Tag модель

@Entity 
@Table(name = "tags") 
public class Tag implements Serializable { 

    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Id 
    @Getter 
    private Long id; 

    @Getter 
    @Setter 
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH}) 
    private Set<Place> places = new HashSet<>(); 

    public void addPlace(Place placeToPersist) { 
     this.places.add(placeToPersist); 
    } 
} 

И вот как я это сохраняю. Дело в том, что я хочу связать место с существующими тегами базы данных, но если тег новый, он должен его сохранить.

public void processForm(Place placeToPersist, Set<Tag> tagsToCheck) { 
    Set<Tag> tmpSet = new HashSet<>(); 

    for (Tag t : tagsToCheck) { 
     Tag tagFromDatabase = tagService.findByName(t.getName()); 
     if (tagFromDatabase == null) { 
      t.addPlace(placeToPersist); 
      tagService.save(t); //why I can't save here my tag? 
      tmpSet.add(t); 
     } else { 
      tagFromDatabase.addPlace(placeToPersist); 
      tmpSet.add(tagFromDatabase); 
     } 
    } 
    placeToPersist.setTags(tmpSet); 
    placeService.save(placeToPersist); 
} 

Вход

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: pl.project.app.model.Place 

ответ

2

почему я не могу сохранить здесь свой тег?

Так же, как ошибка говорит: потому что вы пытаетесь сохранить тег, который имеет ссылку на место, хотя Место еще не настойчиво. И поскольку для SAVE (или PERSIST) нет каскадного набора, в зависимости от того, что делает метод save(), место не сохраняется при сохранении тега.

Итак, сначала сохраните место, затем добавьте место в тег и сохраните тег (или сохраните тег, а затем добавьте место в тег).

0

попробовать положить @Transactional на метод/класс или автоматического связывания с TransactionTemplate использовать для выполнения запроса