Repository 24.00
Repository
-malli webforJ:ssa tarjoaa standardoidun tavan hallita ja kysyä kokoelmia entiteeteistä. Se toimii abstraktiokerroksena käyttöliittymäkomponenttiesi ja tietojen välillä, jolloin eri tietolähteiden kanssa työskentely on helppoa pitäen samalla johdonmukaisen käyttäytymisen.
Miksi käyttää repositorya
Repository
poistaa manuaaliset päivitykset säilyttäen alkuperäiset tietosi ehjinä:
// Ilman Repositorya - manuaaliset päivitykset
List<Customer> customers = loadCustomers();
Table<Customer> table = new Table<>();
table.setItems(customers);
// Lisääminen edellyttää täyden uudelleenlatauksen
customers.add(newCustomer);
table.setItems(customers); // On ladattava kaikki uudelleen
// Repositoryn kanssa - automaattinen synkronointi
List<Customer> customers = loadCustomers();
CollectionRepository<Customer> repository = new CollectionRepository<>(customers);
Table<Customer> table = new Table<>();
table.setRepository(repository);
// Lisääminen synkronoituu automaattisesti
customers.add(newCustomer);
repository.commit(newCustomer); // Päivittää vain muutetut
Kokoelma repository
CollectionRepository
on yleisin toteutus ja se kääritsee minkä tahansa Java-kokoelman:
// ArrayListista
List<Customer> customers = new ArrayList<>();
CollectionRepository<Customer> customerRepo = new CollectionRepository<>(customers);
// HashSetistä
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
Repository
toimii sillan tavoin tietosi ja käyttöliittymäkomponenttien välillä. Kun tiedot muuttuvat, ilmoitat repositorylle commit()
-metodin kautta:
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 kytketyt komponentit päivittävät
// Päivitä olemassa oleva tuote
products.get(0).setPrice(89.99);
repository.commit(products.get(0)); // Päivittää vain tämän erityisen rivin
// Poista tuote
products.remove(2);
repository.commit(); // Uudistaa näkymän
Commit-metodilla on kaksi allekirjoitusta:
commit()
- Kehottaa repositoryä päivittämään kaiken. Se laukaiseeRepositoryCommitEvent
:in kaikilla nykyisillä tiedoilla.commit(entity)
- Kohdistaa erityiseen entiteettiin. Repository löytää tämän entiteetin sen avaimen perusteella ja päivittää vain vaikuttavat käyttöliittymäelementit.
Tämä erottelu on tärkeä suorituskyvyn kannalta. Kun päivität yhden kentän 1000 rivin taulukossa, commit(entity)
päivittää vain tämän solun, kun taas commit()
päivittäisi kaikki rivit.
Datan suodatus
Repositoryn suodatin kontrolloi, mitkä tiedot kulkevat kytkettyihin komponentteihin. Taustalla oleva kokoelma pysyy muuttumattomana, koska suodatin toimii linssinä:
// Suodata varastotilanteen mukaan
repository.setBaseFilter(product -> product.getStock() > 0);
// Suodata kategorian mukaan
repository.setBaseFilter(product -> "Electronics".equals(product.getCategory()));
// Yhdistä useita ehtoja
repository.setBaseFilter(product ->
product.getCategory().equals("Electronics") &&
product.getStock() > 0 &&
product.getPrice() < 100.0
);
// Tyhjennä suodatin
repository.setBaseFilter(null);
Kun asetat suodattimen, Repository
:
- Soveltaa ehtoa jokaiseen kohteeseen kokoelmassasi
- Luo suodatetun virran vastaavista kohteista
- Ilmoittaa kytkettyille komponenteille, että niiden näyttö on päivitettävä
Suodatin pysyy voimassa, kunnes muutat sitä. Uudet kokoelmaan lisätyt kohteet testataan automaattisesti nykyistä suodatinta vastaan.
Työskentely entiteettiavainten kanssa
Kun entiteettisi toteuttavat HasEntityKey
, repository voi löytää ja päivittää erityisiä kohteita niiden ID:n perusteella:
public class Customer implements HasEntityKey {
private String customerId;
private String name;
private String email;
@Override
public Object getEntityKey() {
return customerId;
}
// Konstruktori ja getterit/setterit...
}
// Etsi avaimen mukaan
Optional<Customer> customer = repository.find("C001");
// Päivitä erityinen asiakas
customer.ifPresent(c -> {
c.setEmail("newemail@example.com");
repository.commit(c); // Vain tämän asiakkaan rivi päivittyy
});
Ilman HasEntityKey
:ia:
repository.find("C001")
ei löydä asiakastasi, koska se etsii objektia, joka on yhtä kuin "C001"repository.commit(entity)
toimii silti, mutta riippuu objektin tasa-arvosta- Käyttöliittymäkomponentit eivät voi valita kohteita ID:n mukaan, vain objektiviittauksen perusteella
Käyttöliittymän integrointi
Repository
integroituu datasta tietoisiin komponentteihin:
// Luo repository ja taulukko
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ää tietoja - taulukko päivittyy automaattisesti
customers.add(new Customer("C001", "Alice Johnson", "alice@example.com"));
repository.commit();
Seuraavat vaiheet
📄️ Querying data
QueryableRepository -rajapinta laajentaa Repository -rajapintaa edistyneillä kyselyominaisuuksilla RepositoryCriteria:n kautta. Toisin kuin perusrepositoriot, jotka tukevat vain yksinkertaista suodattamista, kyselyrepositoriot tarjoavat rakenteellista kyselyä mukautettujen suodatin tyyppien, lajittelun ja sivutuksen avulla.
📄️ Custom data sources
Kun tietosi sijaitsevat sovelluksesi ulkopuolella - REST API:ssa, tietokannassa tai ulkoisessa palvelussa - sinun on luotava mukautettu varaston toteutus. DelegatingRepository -luokka tekee tämän suoraviivaiseksi antamalla sinun määrittää funktioita sen sijaan, että toteuttaisit koko luokan.
📄️ Events and updates
Repository-tapahtumat antavat sinun reagoida tietomuutoksiin. Automaattisten käyttöliittymäpäivitysten ohella voit kuunnella muutoksia ja laukaista mukautettua logiikkaa.