本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
扁平化其他類別的屬性
如果資料表的屬性分散在數個不同的 Java 類別,無論是透過繼承或構成,DynamoDB 增強型用戶端API都會提供支援,將屬性平整為一個類別。
使用繼承
如果您的 類別使用繼承,請使用下列方法來扁平化階層。
使用註釋的豆類
對於註釋方法,兩個類別都必須攜帶@DynamoDbBean
註釋,而類別必須攜帶一或多個主要金鑰註釋。
下列顯示具有繼承關係的資料類別範例。
使用靜態結構描述
對於靜態結構描述方法,請使用建置器extend()
的方法,將父類別的屬性摺疊到子類別。這會在下列範例中的註解行 1 之後顯示。
StaticTableSchema<org.example.tests.model.inheritance.stat.GenericRecord> GENERIC_RECORD_SCHEMA = StaticTableSchema.builder(org.example.tests.model.inheritance.stat.GenericRecord.class) // The partition key will be inherited by the top level mapper. .addAttribute(String.class, a -> a.name("id") .getter(org.example.tests.model.inheritance.stat.GenericRecord::getId) .setter(org.example.tests.model.inheritance.stat.GenericRecord::setId) .tags(primaryPartitionKey())) .addAttribute(String.class, a -> a.name("created_date") .getter(org.example.tests.model.inheritance.stat.GenericRecord::getCreatedDate) .setter(org.example.tests.model.inheritance.stat.GenericRecord::setCreatedDate)) .build(); StaticTableSchema<org.example.tests.model.inheritance.stat.Customer> CUSTOMER_SCHEMA = StaticTableSchema.builder(org.example.tests.model.inheritance.stat.Customer.class) .newItemSupplier(org.example.tests.model.inheritance.stat.Customer::new) .addAttribute(String.class, a -> a.name("name") .getter(org.example.tests.model.inheritance.stat.Customer::getName) .setter(org.example.tests.model.inheritance.stat.Customer::setName)) // 1. Use the extend() method to collapse the parent attributes onto the child class. .extend(GENERIC_RECORD_SCHEMA) // All the attributes of the GenericRecord schema are added to Customer. .build();
先前的靜態結構描述範例使用下列資料類別。由於映射是在您建置靜態資料表結構描述時定義的,因此資料類別不需要註釋。
使用 撰寫
如果您的 類別使用組成,請使用下列方法來扁平化階層。
使用註釋的豆類
@DynamoDbFlatten
註釋會扁平包含的類別。
下列資料類別範例使用@DynamoDbFlatten
註釋,有效地將包含GenericRecord
類別的所有屬性新增至Customer
類別。
您可以使用扁平註釋,視需要盡可能扁平化許多不同的合格類別。以下為目前的限制:
-
所有屬性名稱在扁平化後必須是唯一的。
-
絕對不能有一個以上的分割區金鑰、排序金鑰或資料表名稱。
使用靜態結構描述
當您建置靜態資料表結構描述時,請使用 建置器flatten()
的方法。您也可以提供識別包含類別的 getter 和 setter 方法。
StaticTableSchema<GenericRecord> GENERIC_RECORD_SCHEMA = StaticTableSchema.builder(GenericRecord.class) .newItemSupplier(GenericRecord::new) .addAttribute(String.class, a -> a.name("id") .getter(GenericRecord::getId) .setter(GenericRecord::setId) .tags(primaryPartitionKey())) .addAttribute(String.class, a -> a.name("created_date") .getter(GenericRecord::getCreatedDate) .setter(GenericRecord::setCreatedDate)) .build(); StaticTableSchema<Customer> CUSTOMER_SCHEMA = StaticTableSchema.builder(Customer.class) .newItemSupplier(Customer::new) .addAttribute(String.class, a -> a.name("name") .getter(Customer::getName) .setter(Customer::setName)) // Because we are flattening a component object, we supply a getter and setter so the // mapper knows how to access it. .flatten(GENERIC_RECORD_SCHEMA, Customer::getRecord, Customer::setRecord) .build();
先前的靜態結構描述範例使用下列資料類別。
您可以使用建置器模式,視需要盡可能縮減許多不同的合格類別。
對其他程式碼的影響
當您使用@DynamoDbFlatten
屬性 (或flatten()
建置方法) 時,DynamoDB 中的項目會包含已編寫物件的每個屬性的屬性。它也包含編寫物件的屬性。
相反地,如果您使用編寫的類別註釋資料類別,但不使用 @DynamoDbFlatten
,則該項目會與編寫的物件一起儲存為單一屬性。
例如,將平面化中顯示的Customer
類別與組成範例進行比較,其中和不平面化record
屬性。 使用註釋的豆類您可以使用 視覺化差異JSON,如下表所示。
具有扁平化 | 沒有扁平化 |
---|---|
3 個屬性 | 2 個屬性 |
|
|
如果您有其他程式碼存取預期尋找特定屬性的 DynamoDB 資料表,差異就變得重要。