我在 1:M 關系中有 2 個 Oracle 表:
EVENT(ID, NAME, DATE)
EVENT_LOG(ID, EVENT_ID, COMPLETED)
事件有 PK=ID
EVENT_LOG 在 EVENT.ID 上有 PK=ID 和 FK=EVENT_ID
它們對應的 JPA 物體定義如下:
@Entity
@Table(name = "EVENT")
public class EventEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ID")
private Long id;
@OneToMany(mappedBy = "event", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<EventLogEntity> eventLogs;
...
}
@Entity
@Table(name = "EVENT_LOG")
public class EventLogEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "EVENT_ID")
private EventEntity event;
}
持久化是通過方法完成的:
private EventEntity saveEvent(EventDto eventDto) {
EventEntity eventEntity = new EventEntity();
ModelMapper modelMapper = new ModelMapper();
modelMapper.map(eventDto, eventEntity);
List<EventLogEntity> eventLogs = new ArrayList<EventLogEntity>();
EventLogEntity eventLogEntity = new EventLogEntity();
eventLogEntity.setCompleted(0); //0-not-completed, 1-completed
eventLogs.add(eventLogEntity);
eventEntity.setEventtLogs(eventLogs);
EventEntity storedEvent = eventRepository.saveAndFlush(eventEntity);
return storedEvent;
}
更新
EVENT 和 EVENT_LOG 資料按原樣保留,我得到如下資料:
EVENT(ID, NAME, DATE) = (1, 'send_msg', 20220210T11:55:10)
EVENT_LOG(ID, EVENT_ID, COMPLETED) = (1, 1, 0) // 0 = not sent
這一切都很好,但是我將收到 send_msg 事件的回應,我需要插入新的 EVENT_LOG 插入以成功發送,它應該如下所示:
EVENT_LOG(ID, EVENT_ID, COMPLETED) = (1, 1, 1) // 1 = sent
這是由另一種稱為 saveEventLog 的方法完成的:
private EventLog saveEventLog(EventEntity eventEntity) {
EventLog eventLogEntity = new EventLog();
eventLogEntity.setIsSent(1);
eventLogEntity.setEvent(eventEntity); //WAS MISSING THIS LINE WHICH LED TO ERROR ORA-01400
EventLog storedEventLog = eventLogRepository.saveAndFlush(eventLogEntity);
if (storedEventLog == null) {
throw new Exception(...);
}
return storedEventLog;
}
問題
如果我使用 H2 資料庫,我的物體會像這樣持久化:
EVENT(ID, NAME, DATE) = (1, 'send_msg', 20220210T11:55:10)
EVENT_LOG(ID, EVENT_ID, COMPLETED) = (1, 1, 0) //1ST ENTRY
EVENT_LOG(ID, EVENT_ID, COMPLETED) = (1, null, 1) //2ND ENTRY
上面 EVENT_ID 的 NULL 不正確,它應該是 1。 這已通過上面的缺失行修復,不再需要關注
但是,在 Oracle 中,我收到錯誤 ORA-01400: cannot insert NULL into ("MYDB"."EVENT_LOG"."EVENT_ID") 并且在呼叫此錯誤時發生此錯誤saveEventLog ,上面缺少的行也已修復,不再需要關注
上述 2 個問題的原因是缺少行設定 EVENT 到 EVENT_LOG 連接: eventLogEntity.setEvent(eventEntity)。
添加后,它作業正常。
但是,我想了解為什么在 H2 上,我在 EVENT_ID 中得到 NULL 并且沒有錯誤,而在 Oracle 中,我得到 ORA-01400。我嘗試在 H2 上設定 MODE=Oracle 以使它們的行為一致,但我仍然可以將記錄插入 H2 而沒有任何問題。
uj5u.com熱心網友回復:
我認為您再次缺少為 設定EventEntity,EventLogEntity應該這樣做:
EventLogEntity eventLogEntity = new EventLogEntity();
eventLogEntity.setCompleted(1);
eventLogEntity.setEventEntityDetails(eventEntity);
eventLogs.add(eventLogEntity);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/505386.html
