@startuml database "h2" as db { entity city { + citycode : VARCHAR 255 cityname : VARCHAR 255 folder : VARCHAR 255 lng : VARCHAR 255 lat :VARCHAR 255 } entity site_user { + id : BIGINT active : BOOLEAN admin : BOOLEAN email : VARCHAR 255 password : VARCHAR 255 role :VARCHAR 255 username :VARCHAR 20 } entity task { + citycode : VARCHAR 255 + meshcode : VARCHAR 255 version :VARCHAR 255 path : VARCHAR 255 line : VARCHAR 255 point :VARCHAR 255 } task }|- city : citycode } note bottom of db : spring.datasource.url=jdbc:h2:./taskdb\nspring.jpa.hibernate.ddl-auto=update class SecurityConfig <<Configuration>> { - userDetailsService : UserDetailsService + passwordEncoder() : PasswordEncoder + configure(WebSecurity) configure(HttpSecurity) configure(AuthenticationManagerBuilder) } class UserDetailsServiceImpl <<Service>> { - userRepository : SiteUserRepository + loadUserByUsername(username) : UserDetails + createUserDetails(:SiteUser) : User } class SecurityController <<Controller>> { - userRepository : userRepository - passwordEncoder : PasswordEncoder + success() + showList(loginUser, model) } class SiteUser <<Entity>> { + id : Long - username : String - email : String@Email - admin : boolean - role : String - active : boolean } SiteUser .. site_user class UniqueLoginValidator<UniqueLogin> <<ConstraintValidator>> { - userRepository : SiteUserRepository + isValid(String, ConstraintValidatorContext) : boolean } class UniqueLogin <<Constraint>> { message() : String groups() : Class<?>[] payload() : Class<? extends Payload>[] } interface SiteUserRepository <<JpaRepository>> { findByUsername(String) existsByUsername(String) } SecurityConfig ..> UserDetailsServiceImpl UserDetailsServiceImpl ..> SiteUserRepository SecurityController ..> SiteUserRepository UniqueLoginValidator ..> SiteUserRepository UniqueLogin .. UniqueLoginValidator SiteUserRepository <|-- SiteUser class City <<Entity>> { site : static String + citycode : String@NumberFormat - cityname : String - folder : String - lng : String@NumberFormat - lat : String@NumberFormat + setSite(String) + getSite() : String + setLng(BigDecimal) + setLat(BigDecimal) + setPoint(lng,lat) + getPoint() : Point + toString() : String } City .. city City . CityPK : citycode class CityPK { citycode : String + equals(Object) : boolean + hashCode() : int } interface CityRepository <<JpaRepository>> { findByCitycode(String) : City deleteByCitycode(String) : List<City> } CityRepository <|-- City class CityController <<Controller>> { - repository : CityRepository + showList(model) + addCity(city) + process(city, result) + editCity(id, model) + deleteCity(id) } CityController ..> CityRepository class TaskController <<Controller>> { - repository : TaskRepository + showList(citycode, model) } TaskController ..> TaskRepository interface TaskRepository <<JpaRepository>> { findByCitycode() : List<Task> } TaskRepository <|-- Task class Task <<Entity>> { + id : Long - citycode : String@NumberFormat - meshcode : String version : String path : String point : String line : String + setPoint(Point) + setLine(JsonLine) } Task .. task interface CommandLineRunner class DataLoader <<Component>> { - repository : CityRepository + run() } DataLoader ..> CityRepository CommandLineRunner <|-- DataLoader @enduml