Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Appiattisci gli attributi di altre classi
Se gli attributi della tabella sono distribuiti tra diverse classi Java, tramite ereditarietà o composizione, il DynamoDB Enhanced Client API fornisce il supporto per riunire gli attributi in un'unica classe.
Usa l'ereditarietà
Se le tue classi utilizzano l'ereditarietà, usa i seguenti approcci per appiattire la gerarchia.
Usa fagioli annotati
Per l'approccio all'annotazione, entrambe le classi devono contenere l'@DynamoDbBean
annotazione e una classe deve contenere una o più annotazioni chiave primarie.
Di seguito vengono illustrati esempi di classi di dati che hanno una relazione di ereditarietà.
Usa schemi statici
Per l'approccio allo schema statico, utilizzate il extend()
metodo del generatore per comprimere gli attributi della classe principale nella classe figlia. Questo è mostrato dopo la riga di commento 1 nell'esempio seguente.
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();
Il precedente esempio di schema statico utilizza le seguenti classi di dati. Poiché la mappatura viene definita quando si crea lo schema statico della tabella, le classi di dati non richiedono annotazioni.
Usa la composizione
Se le tue classi usano la composizione, usa i seguenti approcci per appiattire la gerarchia.
Usa fagioli annotati
L'@DynamoDbFlatten
annotazione appiattisce la classe contenuta.
I seguenti esempi di classi di dati utilizzano l'@DynamoDbFlatten
annotazione per aggiungere efficacemente tutti gli attributi della GenericRecord
classe contenuta alla classe. Customer
Puoi usare l'annotazione flatten per appiattire tutte le diverse classi idonee di cui hai bisogno. Vengono applicati i vincoli seguenti:
-
Tutti i nomi degli attributi devono essere univoci dopo essere stati appiattiti.
-
Non deve mai esserci più di una chiave di partizione, chiave di ordinamento o nome di tabella.
Usa schemi statici
Quando crei uno schema di tabella statico, usa il flatten()
metodo del generatore. Fornite anche i metodi getter e setter che identificano la classe contenuta.
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();
Il precedente esempio di schema statico utilizza le seguenti classi di dati.
Puoi utilizzare il modello builder per appiattire tutte le diverse classi idonee di cui hai bisogno.
Implicazioni per altro codice
Quando si utilizza l'@DynamoDbFlatten
attributo (o il metodo flatten()
builder), l'elemento in DynamoDB contiene un attributo per ogni attributo dell'oggetto composto. Include anche gli attributi dell'oggetto che lo compone.
Al contrario, se annotate una classe di dati con una classe composta e non la utilizzate@DynamoDbFlatten
, l'elemento viene salvato con l'oggetto composto come attributo singolo.
Ad esempio, confrontate la Customer
classe mostrata nell'esempio di appiattimento con l'esempio di composizione con e senza appiattimento dell'attributo. record
È possibile visualizzare la differenza con JSON quanto illustrato nella tabella seguente.
Con appiattimento | Senza appiattimento |
---|---|
3 attributi | 2 attributi |
|
|
La differenza diventa importante se si dispone di altro codice che accede alla tabella DynamoDB che prevede di trovare determinati attributi.