我已经看到有一对夫妇的答案,这已经,但是,我似乎不能得到它的权利。
这是我得到的错误:
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
的帖子,我尝试了各种组合,都无济于事,并出现了同样的错误。
如果谁在这个下雨的星期六有空闲时间,我将不胜感激!
1条答案
按热度按时间eagi6jfj1#
当你示例化一个实体类对象时,hib通过跟踪对象的状态来控制它,即 transient 、持久化或分离。
您可以做的是更新存储库方法以接受name作为字符串参数,并在repo方法中执行查询。
还是看这个方案吧。
https://stackoverflow.com/a/70400101/6572971