从 Spring Boot 2.7 迁移到 3.0 后,Spring Data 保存方法停止工作

Spring Data save method stopped to work after migration from spring boot 2.7 to 3.0

提问人:MarcinS 提问时间:11/15/2023 最后编辑:M. DeinumMarcinS 更新时间:11/15/2023 访问量:59

问:

我正在尝试将Spring Boot从2.7.17版迁移到3.0.5版,以及Hibernate(5->6.2.0 Final)。
我的项目中有父子关系(请看下面的代码)。要保存或更新 ,我正在使用界面中的方法(我的扩展了它)。 迁移后,该方法停止工作。在此语句中,我的意思是在调用方法之后成为“父”引用。在调用之前,引用已正确设置(同样,它在迁移之前正在工作)。 我不知道该朝哪个方向看,也不知道版本 3 中发生了什么变化。你能指出我可能出了什么问题吗? 先谢谢你。
Ordersave()org.springframework.data.repository.RepositoryOrderRepositorysave()OrderDetailsnullsave()save()

@Entity
@Table(name = "ORDER")
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@NamedEntityGraph(
        name = "Order.orderDetails",
        attributeNodes = {
                @NamedAttributeNode("orderDetails")
        }
)
public class Order {

    @Id
    @Column(nullable = false)
    @EqualsAndHashCode.Include
    private String orderId;

    @ElementCollection
    @CollectionTable(
            name = "SITE_SPECIFIC_DETAILS_COMMAND",
            joinColumns = @JoinColumn(name = "orderId")
    )
    private Set<OrderDetails> orderDetails;

    // rest of the code omitted for brevity
}

@Embeddable
@NoArgsConstructor
@AllArgsConstructor
@Builder(setterPrefix = "with")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Data
public class OrderDetails {

    @ToString.Exclude
    @Parent
    @EqualsAndHashCode.Include
    private Order parent;

    @Type(JsonType.class)
    @Column(columnDefinition = "jsonb")
    private OrderData data;

    // rest of the code omitted for brevity


存储库:

public interface OrderRepository extends Repository<Order, String> {

   @EntityGraph(attributePaths = {“orderDetails”})
   Order save(Order order);
}
java spring-boot 休眠 spring-data

评论

0赞 Sören 11/15/2023
您确定这些版本号吗?Spring Boot 3.0.0 附带 Hibernate 6.1.5.Final。查看 docs.spring.io/spring-boot/docs/3.0.0/reference/html/...
0赞 MarcinS 11/15/2023
是的,你是对的。我试图玩这些版本,但它并没有解决问题。
0赞 M. Deinum 11/15/2023
在我看来,一种方法看起来不对。最后,确保设置关系的两边,以便添加到集合并设置字段。也只是一个标记接口,要重用方法,您需要 or .除此之外,它还缺少 AND 注释。@EntityGrapghsaveparentRepositorysaveCrudRepositoryJpaRepository@Transactional@Modifying
0赞 MarcinS 11/15/2023
我的主要问题是:为什么上面提到的解决方案在迁移之前工作正常?
0赞 MarcinS 11/15/2023
此外,CrudRepository 仍然在后台使用 em.merge() 方法,这似乎导致了问题。事务在代码的另一部分(在服务上)启动。在这里,我只列出了最关键的部分。

答: 暂无答案