【问题标题】:JPA/Hibernate ManyToOne Association always nullJPA/Hibernate ManyToOne 关联始终为空
【发布时间】:2023-01-11 11:11:53
【问题描述】:

我有两个实体 BookingLegEntityBookingEntity 相互引用。但无论何时我尝试从数据库中检索它们(例如通过 findByUuid),BookingLegEntity.belongsTo 仍然为空。

这是我的实体:

@Entity
@Table(name = "BOOKING_LEG")
@SQLDelete(sql = "UPDATE BOOKING_LEG SET deleted = true WHERE id=?")
@Where(clause = "deleted=false")
public class BookingLegEntity {

    @Id
    @Column(name = "ID", unique = true, updatable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "UUID", nullable = false)
    private UUID uuid;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "BELONGS_TO")
    private BookingEntity belongsTo;

    // .. 

    @ManyToOne
    @JoinColumn(name = "DISTRIBUTOR")
    private DistributorEntity distributor;

    @Column(name = "TRANSPORT_TYPE")
    @Convert(converter = TripTypeEnumConverter.class)
    private TripTypeEnum transportType;

    // ... 

}
@Entity
@Table(name="BOOKINGS")
@SQLDelete(sql = "UPDATE BOOKINGS SET deleted = true WHERE id=?")
@Where(clause = "deleted=false")
public class BookingEntity {

    @Id
    @Column(name="ID", unique=true, updatable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name="BOOKING_ID")
    @Convert(converter = BookingIdConverter.class)
    private BookingId bookingId;

    @ManyToOne
    @JoinColumn(name ="BOOKED_BY")
    private UserEntity bookedBy;

    // ..

    @OneToMany(mappedBy = "belongsTo", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<BookingLegEntity> bookingLegs = new HashSet<>();

    // ... 

}

这是我的存储库:

@Repository
public interface BookingLegRepository extends JpaRepository<BookingLegEntity, Long> {

    Optional<BookingLegEntity> findByUuid(UUID id);

    // ... 

}

数据库本身的值看起来是正确的:

真正奇怪的是,这之前有效(belongsTo 不为空)但突然停止工作。有谁知道我们在这里可能做错了什么?

【问题讨论】:

  • 你不应该在@ManyToOne上使用cascade = CascadeType.ALL,因为删除一个BookingLeg会导致删除整个Booking,尝试删除这个级联

标签: java spring database hibernate jpa


【解决方案1】:

不要在你的ManyToOne注释上使用cascade = CASCADEType.ALL,因为删除一个BookingLeg会导致删除对应的Booking中的所有内容

解决方案应该是使用 cascade = CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}) 取而代之。

在继续使用新实体之前,我会 Truncate CascadeDelete from Bookings where original_itinerary is null

真诚地希望它有所帮助。 (如果没有请不要讨厌)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2019-02-24
    • 2016-03-08
    • 2016-06-04
    相关资源
    最近更新 更多