【问题标题】:Spring Data @ManyToMany update and create entitySpring Data @ManyToMany 更新并创建实体
【发布时间】:2016-03-31 00:34:55
【问题描述】:

我认为用现有实体保存新实体是很常见的问题(@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

【问题讨论】:

    标签: spring jpa spring-data spring-data-jpa entitymanager


    【解决方案1】:

    尝试将 @Transactional 放在方法/类上或自动装配 TransactionTemplate 以用于执行查询

    【讨论】:

      【解决方案2】:

      为什么我不能在这里保存我的标签?

      正如错误所说:因为您正在尝试保存一个引用地点的标签,尽管地点还不是持久的。并且由于没有为 SAVE(或 PERSIST,取决于 save() 方法所做的)操作设置级联,因此保存标签时不会保存 Place。

      所以,先保存地点,然后将地点添加到标签并保存标签(或保存标签,然后将地点添加到标签)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-21
        • 2023-03-07
        • 2018-07-03
        • 2022-01-12
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        相关资源
        最近更新 更多