0

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

booking

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

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

由于当前的数据库设计,这两个表之间没有任何约束,这意味着可能存在一个预订条目而没有任何 booking_info 条目,反之亦然。booking_idin booking_infotable 是引用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

}

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

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数据库中始终为空。

任何帮助,将不胜感激。

4

1 回答 1

0

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

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

于 2018-07-11T11:35:49.407 回答