Задать вопрос
  • Может ли Service иметь репозитории других классов?

    @Akela_wolf
    Extreme Programmer
    Технически вам никто не мешает так делать

    Архитектурно - нужно смотреть по конкретному проекту.
    Ответ написан
    1 комментарий
  • Может ли Service иметь репозитории других классов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Могу ли я прямо обратиться к репозиторию Entity A из Service B?

    Да, можно. Другой вопрос - хорошо ли.

    Или мне надо это делать вот так Service B -> Service A -> Repository A?

    Я предпочитаю этот способ.
    Причина следующая:
    Вот, представьте, что на сервисном уровне вы получаете Optional<T> из репозитория и в случае, если объект не найден, то на сервисном уровне выбрасываете исключение orElseThrow(). Ну а далее ExceptionHandler ловит исключение и отдает соответствующий код ошибки и сообщение на фронт.
    Если вы решите из сервиса А обратиться в репозиторий Б, то по факту вам нужно заново получить объект и выбросить исключение в случае, если он не найден, а это уже дублирование кода...
    Псевдокод:
    ServiceA {
    @Autowired
    RepoB repoB;
    @Autowired
    ServiceB serviceB;
    
    // 1 вариант
    List<Job> doSomeJob1(String email){
    User user =  repoB.findUserByEmail(email).orElseThrow(UserNotFoundException::new);
    return user.getJobs();
    }
    
    // 2 вариант
    List<Job> doSomeJob2(String email) {
    User user = serviceB.getUserByEmail(email);
    return user.getJobs();
    }
    
    RepoB {
    Optional<User> findUserByEmail(String email);
    }
    
    ServiceB {
    @Autowired
    RepoB repoB;
    
    User getUserByEmail(String email){
    return repoB.findUserByEmail(email).orElseThrow(UserNotFoundException::new);
    }
    
    }


    Во втором варианте нам не пришлось писать логику и выбрасывать исключение.
    А так многое зависит от проекта, от того, как принято в команде работать и т.д.

    Проблема в том, что у меня все сервисы DTOшки, а для работы Service B нужны нормальные объекты, что делать в таком случае? Неужели создавать отдельные точно такие же методы просто без конверта в дто?

    Я это обычно, делаю по другому. Я возвращаю объекты из сервисов. А если мне нужно DTO, то есть отдельный сервис MapperService, который принимимает дженерик и возвращает соответствующие DTO.
    Ответ написан
    4 комментария
  • Какие отношения должны быть между этими двумя Entity?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Нечто похожее уже обсуждалось в данном вопросе:
    https://qna.habr.com/q/1111518

    Допустим, что у вас есть сущность Product, а также сущность Order.
    В одном заказе может быть некоторое кол-во одного товара, а значит, вам где-то нужно хранить еще и кол-во заказанного товара.
    Для этого подойдет аггрегация, как вариант.
    Т.е. нужно завести доп. таблицу (например, OrderData), в которой foreign_keys будут являться и product_id и order_id, а также будет. доп. колонка quantity.
    +----------+------------+----------+
    | order_id | product_id | quantity |
    +----------+------------+----------+
    |        1 |          2 |       10 |
    |        2 |          3 |       11 |
    +----------+------------+----------+


    Таким образом, у вас должно получится что-то типа такого (псевдокод):
    Product {
    long productId;
    }
    Order {
    long orderId;
    }
    OrderData {
    Order order;
    Product product;
    int quantity;
    }


    Другой вариант:
    это как указано в вопросе по ссылке выше. Использовать мапу.
    Привожу ссылку на полезный ресурс:
    https://www.baeldung.com/hibernate-persisting-maps
    Что в данном случае должно получиться (псевдокод):
    Product {
    long productId;
    }
    
    Order {
    
    @MapKeyColumn(name = "product_id")
    @Column(name = "quantity")
    Map<Long, Integer>
    }


    В данном случае, мы указываем на MapKeyColumn. Т.е. уник. ключом будет являться идентификатор продукта. А значением будет его кол-во (название указано в Column).

    Наверняка, если подумать еще, то можно найти еще варианты.
    Ответ написан
    Комментировать
  • Можно ли получить магистратуру по Computer Science если у меня гуманитарное образование?

    Jacen11
    @Jacen11
    подразумевается что возможно. Но видишь ли, тут приходит реальность. А в реальности студенты, которые учились в этом унивире, достают вопросы или даже ответы на экзамены для магистратуры и шансов конкурировать с ними не особо. Правда в моем уинвере был год когда внезапно изменили вопросы и многие пролетели, но все равно были те кому кафедра дала баллы за "заслуги".
    Если конкурс маленький, то поступить будет легко.
    Ответ написан
    Комментировать
  • Можно ли получить магистратуру по Computer Science если у меня гуманитарное образование?

    @d-sem
    Все сильно зависит от конкретной специальности, ВУЗа и даже кафедры. Где то сдаешь экзамены, а где то просто общаешься в деканате, когда приносишь документы и оплачиваешь счет.

    На практике, в РФ, не раз наблюдал ситуацию когда у человека есть бакалавриат по гуманитарному направлению и магистратура по техническому.
    Ответ написан
    1 комментарий
  • В каком виде лучше хранить Entity заказ - количество закзаанного?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    В вопросе подробностей маловато. Какая база предполагается будет реально хранить этот entity ? Если это классическая реляционка, то на мой взгляд лучше хранить как List или Set. Потенциально Map мог бы дать возможность получать доступ к элементу заказа по его номеру (или какому то ключу) за O(1) время (т е за константное время) Это давало бы выигрыш в случае очень больших заказов с большим количеством элементов. Но поскольку реально значение хранит база, то, если необходимо выполнить поиск одного элемента, не подтягивая весь список в память, это можно сделать выборкой по индексу. (например id заказа + id элемента или же просто "сквозной" id элемента) Если же заказы не будут превышать 10-50 элементов, то и вообще нет смысла заморачиваться и надо выбирать наиболее простой способ, т е List. Уже в самом коде можно организовать доступ к этому полю как угодно. Из-за малого размера списка проблем с производительностью быть не должно.
    Ответ написан
    2 комментария
  • JDBC, почему нельзя использовать один Connection для нескольких методов в разрезе многопоточности?

    @Akela_wolf
    Extreme Programmer
    1. Синхронизация между потоками. Если оба потока начнут посылать запросы в БД через один коннекшен - могут начаться спецэффекты (тут нужно курить "потокобезопасность" коннекшена)
    2. Транзакции в БД. Запросы через один коннекшен будут в одной транзакции. Если для вас это ОК - то все ок. Если же разные потоки требуют разных транзакций - то придется каждому потоку выдавать свой коннекшен.
    100 пользователей и 100 потоков - это слегка разные вещи. Я бы в первую очередь посмотрел сюда - по потоку на каждого пользователя для меня выглядит подозрительно. Если это веб, то у вас от каждого пользователя приходит запрос, обрабатывается, отправляется ответ. Все. Если от пользователей приходит мало запросов - это может делать и один поток. И даже в случае вебсокетов - все равно не нужно держать по потоку на пользователя.
    Ответ написан
    Комментировать
  • JDBC, почему нельзя использовать один Connection для нескольких методов в разрезе многопоточности?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Можно использовать, но нужно делать синхронизацию между разными потлками.
    Проблема в том, что один поток будет ждать ответа на свой запрос, в то время, как другой поток захочет выполнить свой запрос.
    Так что, если добавите синхронизацию, то можно.
    Но вообще-то не нужно изобретать велосипеды, пользуйтесь пулами соединений, их есть много разных.
    Например hikaricp https://habr.com/ru/post/269023/
    Ответ написан
    Комментировать
  • Как сделать input количества для айтемов в меню независимым друг для друга в этом JS?

    sasha-hohloma
    @sasha-hohloma
    Fullstack Developer
    У вас ошибка доступа к элементу input. По спецификации на весь документ можно использовать только один id, поэтому у вас любое событие меняет только один первый input. Правильней будет получать элементы по классу и на каждый элемент вешать обработчик клика. Но поскольку, вам нужно кликом по одному элементу менять свойства другого элемента, то задача немного усложняется. В моем примере JS сначала читает родительские элемент кнопок и инпута, а потом уже для каждой группы читает атрибуты и вешает обработчики событий
    Ответ написан
    1 комментарий
  • Java, должно ли чтение коллекций или переменных быть Thread Safe?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    почему я не могу прочитать обычную коллекцию ( не изменяя ее ) из разных Thread

    Можете, если никто её не изменяет. Иначе можете изменений не увидеть.

    Или одну и ту же переменную, если она будет final

    Тем более можете.

    Я был бы очень рад и благодарен, если бы кто-то смог доступно объяснить.

    Тема сложная, не стоит искать ответов в интернете, тут и обмануть могут. Лучше прочитайте "Java Concurrency in Practice".
    Ответ написан
    1 комментарий