扁平化其他類別的屬性 - AWS SDK for Java 2.x

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

扁平化其他類別的屬性

如果資料表的屬性分散在數個不同的 Java 類別,無論是透過繼承或構成,DynamoDB 增強型用戶端API都會提供支援,將屬性平整為一個類別。

使用繼承

如果您的 類別使用繼承,請使用下列方法來扁平化階層。

使用註釋的豆類

對於註釋方法,兩個類別都必須攜帶@DynamoDbBean註釋,而類別必須攜帶一或多個主要金鑰註釋。

下列顯示具有繼承關係的資料類別範例。

Standard data class
@DynamoDbBean public class Customer extends GenericRecord { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } @DynamoDbBean public abstract class GenericRecord { private String id; private String createdDate; @DynamoDbPartitionKey public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCreatedDate() { return createdDate; } public void setCreatedDate(String createdDate) { this.createdDate = createdDate; } }
Lombok

Lombok onMethod的選項會將屬性型 DynamoDB 註釋,例如 @DynamoDbPartitionKey複製到產生的程式碼。

@DynamoDbBean @Data @ToString(callSuper = true) public class Customer extends GenericRecord { private String name; } @Data @DynamoDbBean public abstract class GenericRecord { @Getter(onMethod_=@DynamoDbPartitionKey) private String id; private String createdDate; }

使用靜態結構描述

對於靜態結構描述方法,請使用建置器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();

先前的靜態結構描述範例使用下列資料類別。由於映射是在您建置靜態資料表結構描述時定義的,因此資料類別不需要註釋。

Standard data class
public class Customer extends GenericRecord { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public abstract class GenericRecord { private String id; private String createdDate; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCreatedDate() { return createdDate; } public void setCreatedDate(String createdDate) { this.createdDate = createdDate; }
Lombok
@Data @ToString(callSuper = true) public class Customer extends GenericRecord{ private String name; } @Data public abstract class GenericRecord { private String id; private String createdDate; }

使用 撰寫

如果您的 類別使用組成,請使用下列方法來扁平化階層。

使用註釋的豆類

@DynamoDbFlatten 註釋會扁平包含的類別。

下列資料類別範例使用@DynamoDbFlatten註釋,有效地將包含GenericRecord類別的所有屬性新增至Customer類別。

Standard data class
@DynamoDbBean public class Customer { private String name; private GenericRecord record; public String getName() { return this.name; } public void setName(String name) { this.name = name; } @DynamoDbFlatten public GenericRecord getRecord() { return this.record; } public void setRecord(GenericRecord record) { this.record = record; } @DynamoDbBean public class GenericRecord { private String id; private String createdDate; @DynamoDbPartitionKey public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getCreatedDate() { return this.createdDate; } public void setCreatedDate(String createdDate) { this.createdDate = createdDate; } }
Lombok
@Data @DynamoDbBean public class Customer { private String name; @Getter(onMethod_=@DynamoDbFlatten) private GenericRecord record; } @Data @DynamoDbBean public class GenericRecord { @Getter(onMethod_=@DynamoDbPartitionKey) private String id; private String createdDate; }

您可以使用扁平註釋,視需要盡可能扁平化許多不同的合格類別。以下為目前的限制:

  • 所有屬性名稱在扁平化後必須是唯一的。

  • 絕對不能有一個以上的分割區金鑰、排序金鑰或資料表名稱。

使用靜態結構描述

當您建置靜態資料表結構描述時,請使用 建置器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();

先前的靜態結構描述範例使用下列資料類別。

Standard data class
public class Customer { private String name; private GenericRecord record; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public GenericRecord getRecord() { return this.record; } public void setRecord(GenericRecord record) { this.record = record; } public class GenericRecord { private String id; private String createdDate; public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getCreatedDate() { return this.createdDate; } public void setCreatedDate(String createdDate) { this.createdDate = createdDate; } }
Lombok
@Data public class Customer { private String name; private GenericRecord record; } @Data public class GenericRecord { private String id; private String createdDate; }

您可以使用建置器模式,視需要盡可能縮減許多不同的合格類別。

對其他程式碼的影響

當您使用@DynamoDbFlatten屬性 (或flatten()建置方法) 時,DynamoDB 中的項目會包含已編寫物件的每個屬性的屬性。它也包含編寫物件的屬性。

相反地,如果您使用編寫的類別註釋資料類別,但不使用 @DynamoDbFlatten,則該項目會與編寫的物件一起儲存為單一屬性。

例如,將平面化中顯示的Customer類別與組成範例進行比較,其中和不平面化record屬性。 使用註釋的豆類您可以使用 視覺化差異JSON,如下表所示。

具有扁平化 沒有扁平化
3 個屬性 2 個屬性
{ "id": "1", "createdDate": "today", "name": "my name" }
{ "id": "1", "record": { "createdDate": "today", "name": "my name" } }

如果您有其他程式碼存取預期尋找特定屬性的 DynamoDB 資料表,差異就變得重要。