JPA从一个方面与不存在的实体保持一对一的持久性



我有一个旧数据库,其中有两个表之间有隐式关联:

booking
- id
- name
... some other fields...

booking_info
- id
- booking_id
... some other fields...

由于当前的数据库设计,这两个表之间没有任何约束,这意味着一个预订条目可能存在而没有任何booking_info条目,反之亦然。booking_info表中的booking_id是一个隐式外键,它引用了booking表(列id(,但也可能引用了缺席预订。

我为这些表创建了以下JPA映射:

@Entity
public class Booking {
@Id
private Long id;
private String name;
// getters & setters
}

@Entity
public class BookingInfo {
@Id
private Long id;
@OneToOne
@JoinColumn(name = "booking_id")
private Booking booking
// getters & setters
}

现在,即使数据库中没有相关的Booking条目,我也需要能够持久化BookingInfo实体。

BookingInfo bookingInfo = new BookingInfo();
bookingInfo.setId(1);
Booking booking = new Booking();
booking.setId(182); // let's say that there's no booking with id 182 in my database, but I still need to persist this bookingInfo
bookingInfo.setBooking(booking);
bookingInfoRepository.save(bookingInfo); // using Spring Data JPA

如果我运行这个代码,那么我会得到javax.persistence.EntityNotFoundException,因为没有id为182的预订。

对于使用JPA或Hibernate的情况,什么是合适的解决方法。顺便说一句,我还尝试使用Hibernate的@NotFound注释。因此,save方法不抛出javax.persistence.EntityNotFoundException,实体在数据库中被持久化,但问题是数据库中的booking_id始终为null。

如有任何帮助,我们将不胜感激。

我不确定我的答案是否对你有帮助,但你得到的结果完全有意义。由于您正在设置一个JPA对象,而该对象不存在,因此会保存null值。如果您想将182保存为一个整数,则不需要执行JPA关系。相反,您只需在预订信息中使用预订id作为整数字段。这是有道理的,因为您实际上没有JPA试图实现的那些表之间的关系。

但我相信你只是想节省182英镑,并保持JPA的关系。我相信您已经知道了,但是您所采用的方法并没有维护数据库的完整性。我相信这背后有足够的理由。但我的建议是在DB中应用适当的约束,然后在JPA中应用。

最新更新