рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреА-рд╡реИрд▓реНрдпреВ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдЦреЛрдЬреЛрдВ рдХрд╛ рдЖрдпреЛрдЬрди

рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рд╕рд┐рд╕реНрдЯрдо рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ, рдбреЗрдЯрд╛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐, рдХреЛрдб, рдирд╛рдо, рдЖрджрд┐ рд╣реИрдВред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдХреНрд╕рд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ: рдХреЛрдб, рдЖрдИрдбреА, рдирд╛рдо, рдЖрджрд┐ред рдЖрд╡реЗрджрди рдХреЛрдб рдореЗрдВ рд╕рдВрджрд░реНрдн рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЦреЛрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВред рдЦреЛрдЬреЛрдВ рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ, рдХреЛрдб рджреНрд╡рд╛рд░рд╛, рдорд╛рдирджрдВрдб, рдкреНрд░рдХрд╛рд░, рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ... рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рд▓рдЧрд╛рддрд╛рд░ рдкрд╣реБрдВрдЪ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреА-рд╡реИрд▓реНрдпреВ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдЙрдиреНрдирдд рдЦреЛрдЬ рдФрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЦреЛрдЬ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреА-рд╡реИрд▓реНрдпреВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦреЗрдВред

рдЫрд╡рд┐

рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ KeyValueOperations рд╣реИ, рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ Key-Value рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ HashMap рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ )ред рд╡рд╕реНрддреБрдПрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред

public class Status { @org.springframework.data.annotation.Id private long statusId; private String code; private String name; .... 

рдпрд╣рд╛рдВ рдХреБрдВрдЬреА рд╕реНрдерд┐рддрд┐ рдЖрдИрдбреАрдбреА рд╣реИ, рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдкреВрд░рд╛ рд░рд╛рд╕реНрддрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдЬреЗрдкреАрдП рдЗрдХрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдЖрдИрдбреА рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
KeyValueOperations рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╣реИрдВ

 interface KeyValueOperations { <T> T insert(T objectToInsert); void update(Object objectToUpdate); void delete(Class<?> type); <T> T findById(Object id, Class<T> type); <T> Iterable<T> find(KeyValueQuery<?> query, Class<T> type); .... . 

рддреЛ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрди рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ KeyValueOperations рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 @SpringBootApplication public class DemoSpringDataApplication { @Bean public KeyValueOperations keyValueTemplate() { return new KeyValueTemplate(keyValueAdapter()); } @Bean public KeyValueAdapter keyValueAdapter() { return new MapKeyValueAdapter(ConcurrentHashMap.class); } 

рд╢рдмреНрджрдХреЛрд╢ рднрдВрдбрд╛рд░рдг рд╡рд░реНрдЧ рдпрд╣рд╛рдБ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ - рд╕рдорд╡рд░реНрддреА рд╣рд╛рд╢рдк

рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ рдЬреЗрдкреАрдП рдЗрдХрд╛рдИ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХреЛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

рдпрд╣ "рд╕реНрдерд┐рддрд┐" рдФрд░ "рдХрд╛рд░реНрдб" рдХрд╛ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ

 @Entity public class Status { @org.springframework.data.annotation.Id private long statusId; private String code; private String name; @Id @Column(name = "STATUS_ID") public long getStatusId() { return statusId; } .... @Entity public class Card { @org.springframework.data.annotation.Id private long cardId; private String code; private String name; @Id @Column(name = "CARD_ID") public long getCardId() { return cardId; } ... 

рдпреЗ рдорд╛рдирдХ рд╕рдВрд╕реНрдерд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рджреЛ Id рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдПрдХ рдЬреЗрдкреАрдП рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ KeyValueOperations рдХреЗ рд▓рд┐рдПред

рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рдорд╛рди рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ

 create table STATUS ( status_id NUMBER not null, code VARCHAR2(20) not null, name VARCHAR2(50) not null ); -- Create/Recreate primary, unique and foreign key constraints alter table STATUS add constraint STATUS_PK primary key (STATUS_ID) 

рдЙрдирдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА:

 @Repository public interface CardCrudRepository extends CrudRepository<Card, Long> { } @Repository public interface StatusCrudRepository extends CrudRepository<Status, Long> { } 

рдФрд░ рдпрд╣рд╛рдБ DictionaryProvider рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ KeyValueOperations рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ

 @Service public class DictionaryProvider { private static Logger logger = LoggerFactory.getLogger(DictionaryProvider.class); private Map<Class, CrudRepository> repositoryMap = new HashMap<>(); @Autowired private KeyValueOperations keyValueTemplate; @Autowired private StatusCrudRepository statusRepository; @Autowired private CardCrudRepository cardRepository; @PostConstruct public void post() { repositoryMap.put(Status.class, statusRepository); repositoryMap.put(Card.class, cardRepository); } public <T> Optional<T> dictionaryById(Class<T> clazz, long id) { Optional<T> optDictionary = keyValueTemplate.findById(id, clazz); if (optDictionary.isPresent()) { logger.info("Dictionary {} found in keyValueTemplate", optDictionary.get()); return optDictionary; } CrudRepository crudRepository = repositoryMap.get(clazz); optDictionary = crudRepository.findById(id); keyValueTemplate.insert(optDictionary.get()); logger.info("Dictionary {} insert in keyValueTemplate", optDictionary.get()); return optDictionary; } .... 

рдСрдЯреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдЗрд╕рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдФрд░ KeyValueOperations рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рд░рд▓ рд▓реЙрдЬрд┐рдХ (рдпрд╣рд╛рдВ, рдмрд┐рдирд╛ рдирд▓ рдЖрджрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреЗ), рд╣рдо keyValueTemplate рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо crudRepository рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ keyValueTemplate рдореЗрдВ рдЬрдЧрд╣ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рджреЗрддреЗ рд╣реИрдВред рдмрд╛рд╣рд░ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╕рдм рдХреЗрд╡рд▓ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦреЛрдЬ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдЧрд╛, рддреЛ рд╢рд╛рдпрдж рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП KeyValueOperations рдореЗрдВ CRUD рдСрдкрд░реЗрд╢рди, рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рд╣реА keyValueTemplate рдореЗрдВ рдЦреЛрдЬ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА KeyValueQuery рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ред

  public <T> Optional<T> dictionaryByCode(Class<T> clazz, String code) { KeyValueQuery<String> query = new KeyValueQuery<>(String.format("code == '%s'", code)); Iterable<T> iterable = keyValueTemplate.find(query, clazz); Iterator<T> iterator = iterable.iterator(); if (iterator.hasNext()) { return Optional.of(iterator.next()); } return Optional.empty(); } 

рдФрд░ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЕрдЧрд░ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрд╛ рдерд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ keyValueTemplate рдореЗрдВ рдорд┐рд▓рд╛ рдерд╛, рддреЛ рдЙрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреЛрдб рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдкрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА keyValueTemplate рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╡рд╕рдВрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг:
рдЖрдИрдбреА рдЦреЛрдЬ

  private void find() { Optional<Status> status = dictionaryProvider.dictionaryById(Status.class, 1L); Assert.assertTrue(status.isPresent()); Optional<Card> card = dictionaryProvider.dictionaryById(Card.class, 100L); Assert.assertTrue(card.isPresent()); } 

рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗрдВ

  private void findByCode() { Optional<Card> card = dictionaryProvider.dictionaryByCode(Card.class, "VISA"); Assert.assertTrue(card.isPresent()); } 

рдЖрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 <T> Iterable<T> find(KeyValueQuery<?> query, Class<T> type); 

рдЖрдк рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЫрдБрдЯрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 query.setSort(Sort.by(DESC, "name")); 

рд╕рд╛рдордЧреНрд░реА:

рд╕реНрдкреНрд░рд┐рдВрдЧ-рдбреЗрдЯрд╛ рдХреАрд╡рд▓реНрдпреВ

рдЧрд┐рдердм рдкрд░рд┐рдпреЛрдЬрдирд╛

Source: https://habr.com/ru/post/hi445060/


All Articles