Varasto 24.00
Varasto-malli webforJ:ssa tarjoaa standardoidun tavan hallita ja kysyä olioita. Se toimii abstraktiokerroksena käyttöliittymäkomponenttiesi ja datan välillä, mikä helpottaa työskentelyä erilaisten datalähteiden kanssa säilyttäen samalla johdonmukaisen käyttäytymisen.
Miksi käyttää varastoa
Varasto poistaa manuaaliset päivitykset samalla kun alkuperäinen data pysyy muuttamattomana:
// Ilman varastoa - manuaaliset päivitykset
List<Customer> customers = loadCustomers();
Table<Customer> table = new Table<>();
table.setItems(customers);
// Lisääminen vaatii täydellisen latauksen
customers.add(newCustomer);
table.setItems(customers); // Pakko ladata kaikki uudelleen
// Varaston avulla - automaattinen synkronointi
List<Customer> customers = loadCustomers();
CollectionRepository<Customer> repository = new CollectionRepository<>(customers);
Table<Customer> table = new Table<>();
table.setRepository(repository);
// Lisääminen synkronoi automaattisesti
customers.add(newCustomer);
repository.commit(newCustomer); // Päivittää vain muutetut
Kokoelman varasto
Kokoelman varasto on yleisin toteutus, ja se käärii minkä tahansa Java-kokoelman:
// ArrayListin osalta
List<Customer> customers = new ArrayList<>();
CollectionRepository<Customer> customerRepo = new CollectionRepository<>(customers);
// HashSetin osalta
Set<String> tags = new HashSet<>();
CollectionRepository<String> tagRepo = new CollectionRepository<>(tags);
// Mistä tahansa kokoelmasta
Collection<Employee> employees = getEmployeesFromHR();
CollectionRepository<Employee> employeeRepo = new CollectionRepository<>(employees);
Datan synkronointi
Varasto toimii sillan tavoin datasi ja käyttöliittymäkomponenttien välillä. Kun data muuttuu, ilmoitat varastolle commit()-menetelmällä:
List<Product> products = new ArrayList<>();
CollectionRepository<Product> repository = new CollectionRepository<>(products);
// Lisää uusi tuote
Product newProduct = new Product("P4", "Gizmo", 79.99, 15);
products.add(newProduct);
repository.commit(); // Kaikki liitetyt komponentit päivittyvät
// Päivitä olemassa olevaa tuotetta
products.get(0).setPrice(89.99);
repository.commit(products.get(0)); // Päivittää vain tämän tietyn rivin
// Poista tuote
products.remove(2);
repository.commit(); // Päivittää näkymän
Commit-metodilla on kaksi allekirjoitusta:
commit()- Kertoo varastolle, että koko tämänhetkinen data on päivitettävä. Se laukaiseeRepositoryCommitEvent-tapahtuman kaikella nykyisellä datallacommit(entity)- Kohdistaa tiettyyn entiteettiin. Varasto löytää tämän entiteetin sen avaimen avulla ja päivittää vain vaikuttavat käyttöliittymä-elementit
Tämä ero on merkityksellinen suorituskyvyn kannalta. Kun päivität yhden kentän 1000-rivisessä taulussa, commit(entity) päivittää vain sen solun, kun taas commit() päivittäisi kaikki rivit.
Datan suodatus
Varaston suodatin säätelee, mitä dataa kulkee liitettyihin komponentteihin. Taustalla oleva kokoelmasi pysyy muuttumattomana, koska suodatin toimii linssinä:
// Suodata varastotilanteen mukaan
repository.setBaseFilter(product -> product.getStock() > 0);
// Suodata kategorian mukaan
repository.setBaseFilter(product -> "Sähkölaitteet".equals(product.getCategory()));
// Yhdistä useita ehtoja
repository.setBaseFilter(product ->
product.getCategory().equals("Sähkölaitteet") &&
product.getStock() > 0 &&
product.getPrice() < 100.0
);
// Tyhjennä suodatin
repository.setBaseFilter(null);
Kun asetat suodattimen, varasto:
- Soveltaa ehtoa jokaiselle kohteelle kokoelmassasi
- Luo suodatetun streamin vastaavista kohteista
- Ilmoittaa liitetyille komponenteille päivityksestä
Suodatin pysyy voimassa, kunnes vaihdat sen. Uudet kohteet, jotka lisätään kokoelmaan, testataan automaattisesti nykyistä suodatinta vastaan.
Työskentely entiteettiavainten kanssa
Varaston on pystyttävä tunnistamaan entiteetit ainutlaatuisesti, jotta se tukee toimintoja kuten find() ja commit(entity). On kaksi tapaa määrittää, miten entiteettejä tunnistetaan:
Käyttäen HasEntityKey-rajaa
Toteuta HasEntityKey entiteettiluokassasi:
public class Customer implements HasEntityKey {
private String customerId;
private String name;
private String email;
@Override
public Object getEntityKey() {
return customerId;
}
// Konstruktori ja getterit/setterit...
}
// Löydä avaimen mukaan
Optional<Customer> customer = repository.find("C001");
// Päivitä tietty asiakas
customer.ifPresent(c -> {
c.setEmail("newemail@example.com");
repository.commit(c); // Vain tämän asiakkaan rivi päivittyy
});
Käyttäen mukautettua avaimen tarjoajaa 25.10
Entiteeteille, joille et voi tai et halua toteuttaa HasEntityKey (kuten JPA-entiteetit), käytä setKeyProvider():
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
// JPA-hallittu entiteetti
}
// Määritä varasto käyttämään getId()-metodia
CollectionRepository<Product> repository = new CollectionRepository<>(products);
repository.setKeyProvider(Product::getId);
// Nyt haku toimii ID:n kanssa
Optional<Product> product = repository.find(123L);
Lähestymistavan valitseminen
Molemmat lähestymistavat toimivat, mutta setKeyProvider() on suosittavampi, kun:
- Työskentely JPA-entiteettien kanssa, joilla on
@Id-kenttiä - Et voi muuttaa entiteettiluokkaa
- Tarvitset erilaisia avainstrategioita eri varastoille
Käytä HasEntityKey kun:
- Hallitset entiteettiluokkaa
- Avaimen poimintalogiikka on monimutkainen
- Haluat entiteetin määrittelevän oman identiteettinsä
Käyttöliittymän integraatio
Varasto integroituu dataa tunteviin komponentteihin:
// Luo varasto ja taulu
List<Customer> customers = new ArrayList<>();
CollectionRepository<Customer> repository = new CollectionRepository<>(customers);
Table<Customer> table = new Table<>();
table.setRepository(repository);
table.addColumn("ID", Customer::getId);
table.addColumn("Nimi", Customer::getName);
table.addColumn("Sähköposti", Customer::getEmail);
// Lisää dataa - taulu päivittyy automaattisesti
customers.add(new Customer("C001", "Alice Johnson", "alice@example.com"));
repository.commit();
Seuraavat askeleet
Querying data
Build typed filters, sorting, and pagination with QueryableRepository and RepositoryCriteria for in-memory collections or external sources.
Custom data sources
Wire REST APIs, databases, or external services to webforJ components by supplying find, count, and key-lookup functions to DelegatingRepository.
Events and updates
React to repository commits with RepositoryCommitEvent listeners, choose single-entity or bulk updates, and manage listener registrations.