spring-data-jpa Hibernate/JPA/Sping Boot -对象引用了未保存的 transient 示例

brqmpdu1  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(137)

我已经看到有一对夫妇的答案,这已经,但是,我似乎不能得到它的权利。
这是我得到的错误:

object references an unsaved transient instance - save the transient instance before flushing

这是Item表(尽可能地简化它)。是的,它有2个对自身的引用

@Data
@EqualsAndHashCode
@ToString
@Entity
@Table(name = "item",
)
public class Item {

    @NotNull
    @Id
    @SequenceGenerator(...)
    @GeneratedValue(...)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "desc"
    private String description;

    @Version
    @Column(name = "version")
    private Long version;

    @ManyToOne()
    @JoinColumn(name = "id_2")
    @ToString.Exclude
    @EqualsExclude
    private Item id_2;

    @ManyToOne()
    @JoinColumn(name = "id_3")
    @ToString.Exclude
    @EqualsExclude
    private Item id_3;
}

和dto

@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(name="item")
public class ItemDto implements Serializable {

    @JsonIgnore
    private Long id;
    @NotNull
    private String name;
    private String description;
    private Long version;
    private ItemDto id_2;
    private ItemDto id_3;
}

然后是类别表,其中包含对Item的引用。

@Data
@EqualsAndHashCode
@ToString
@Entity
@Table(name = "category")
public class Category implements Serializable {

    @NotNull
    @Id
    @SequenceGenerator(...)
    @GeneratedValue(strategy ...)
    @Column(name = "category_id")
    private Long id;

    @Column(name = "description")
    private String description;

    @ManyToOne()
    @JoinColumn(name = "item_id")
    @ToString.Exclude
    @EqualsExclude
    private Item item;

    @Column(name = "version")
    private Long version;
}

并且类别dto

@Data
@Schema(name="Category")
public class CategoryDto implements Serializable {

    private Long id;
    @NotBlank
    private String description;
    @NotNull
    private ItemDto item;
    private Long version;
}

在类别库中,我有以下内容:

@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {

    List<Category> findByItem(Item item);
}

在服务中,我尝试查找包含此项目的类别

protected ResponseEntity<List<CategoryDto>> filterCategoriesByItem(String name) {

        Item item = new Item();
        item.setName(name);

        // Here is where I get the transient / save flush error
        List<CategoryDto> list = categoryRepository.findByItem(item)
             .stream()
             .map(mapper::toDto)
             .collect(Collectors.toList());
        ...
        ...
    }

但是当我执行最后一行findByItem(item)时,我得到了这个:

object references an unsaved transient instance - save the transient instance before flushing

我看到一些关于使用cascade=CascadeType.ALL的帖子,我尝试了各种组合,都无济于事,并出现了同样的错误。
如果谁在这个下雨的星期六有空闲时间,我将不胜感激!

eagi6jfj

eagi6jfj1#

当你示例化一个实体类对象时,hib通过跟踪对象的状态来控制它,即 transient 、持久化或分离。
您可以做的是更新存储库方法以接受name作为字符串参数,并在repo方法中执行查询。
还是看这个方案吧。
https://stackoverflow.com/a/70400101/6572971

相关问题