簡體   English   中英

具有空值的 JPA 復合主鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM