Hibernate/JPA报错:object references an unsaved transient instance求助
解决JPA查询时的"object references an unsaved transient instance"报错
报错信息:
object references an unsaved transient instance - save the transient instance before flushing
相关实体类与DTO
Item实体类
@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; }
ItemDto
@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; }
Category实体类
@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; }
CategoryDto
@Data @Schema(name="Category") public class CategoryDto implements Serializable { private Long id; @NotBlank private String description; @NotNull private ItemDto item; private Long version; }
CategoryRepository
@Repository public interface CategoryRepository extends JpaRepository<Category, Long> { List<Category> findByItem(Item item); }
问题场景
服务层中尝试根据Item名称查询关联的Category,执行findByItem(item)时触发上述报错,代码如下:
protected ResponseEntity<List<CategoryDto>> filterCategoriesByItem(String name) { Item item = new Item(); item.setName(name); // 此处触发transient/save flush报错 List<CategoryDto> list = categoryRepository.findByItem(item) .stream() .map(mapper::toDto) .collect(Collectors.toList()); ... ... }
已尝试方案
试过各种cascade=CascadeType.ALL的组合,均无效,仍报错。
内容的提问来源于stack exchange,提问作者klabbaparn
相关产品推荐
相关产品推荐

