[英]JPA composite primary key with null value
我在 oracle 數據庫中有一個包含客戶數據的表。 這是一個簡化的定義:
CUSTOMER (CUSTOMER_ID NUMBER NOT NULL,
SOURCE_SYSTEM VARCHAR2(30),
FULL_NAME VARCHAR2(360),
PHONE_NUMBER VARCHAR2(240)
)
該表的主鍵是(CUSTOMER_ID, SOURCE_SYSTEM)
。
該表有許多行SOURCE_SYSTEM
為空。 在數據庫級別,沒有問題,但是當我嘗試通過 JPA 實體訪問這些行中的任何一行時,它會導致許多問題:
1:使用em.find()
獲取帶有空SOURCE_SYSTEM
的行總是導致返回空值。
2:如果記錄不存在於表中,則使用em.merge()
插入具有空SOURCE_SYSTEM
的行會成功,但在后續更新時會失敗,因為合並總是會導致運行插入。
3:使用em.createQuery()
顯式查詢具有 null 的行會導致以下異常:
Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.3.1.v20111018-r10243):
org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [ArrayRecord(
CUSTOMER.CUSTOMER_ID => 1
CUSTOMER.FULL_NAME => GUY PERSON
CUSTOMER.PHONE_NUMBER => 555-555-1234
CUSTOMER.SOURCE_SYSTEM => null)] during the execution of the query was detected to be null.
Primary keys must not contain null.
Query: ReadAllQuery(referenceClass=Customer sql="SELECT CUSTOMER_ID, FULL_NAME, PHONE_NUMBER, SOURCE_SYSTEM FROM CUSTOMER WHERE ((CUSTOMER_ID = ?) AND (SOURCE_SYSTEM IS NULL))")
不幸的是,“主鍵不能包含空值”似乎是最終的。 我無法找到有關此錯誤解決方法的太多信息,這使得似乎沒有解決方案。
問題:我想知道是否有人有任何不涉及對數據庫進行更改的基於 Java 代碼的解決方案。 我目前的解決方法是使用ROW_ID
作為表的@Id
,但這意味着我不能再使用em.merge()
或em.find()
。
這是我的 Java 類:
客戶.java:
@Entity
@Table(name = "CUSTOMER")
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private Customer_Id key;
@Column(name = "CUSTOMER_ID", nullable = false, insertable = false, updatable = false)
private Long customerId;
@Column(name = "SOURCE_SYSTEM", length = 30, insertable = false, updatable = false)
private String sourceSystem;
@Column(name = "FULL_NAME", length = 360)
private String fullName;
@Column(name = "PHONE_NUMBER", length = 240)
private String phoneNumber;
//Setters, Getters, etc
...
}
客戶 ID.java
@Embeddable
public class Customer_Id implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "CUSTOMER_ID", nullable = false)
private Long customerId;
@Column(name = "SOURCE_SYSTEM", length = 30)
private String sourceSystem;
//Setters, Getters, etc
...
}
主鍵不能包含 null(在 JPA 或數據庫中)。 使用不同的值,例如 "" 或 " "。
customer_id 是唯一的嗎? 如果是這樣,那么只需從 Id 中刪除 sourceSystem。
否則,您可以嘗試記錄錯誤以添加對空 ID 的支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.