Spring Boot: JPA ManyToMany - подписки и подписчики

Ғылым және технология

Spring Boot Web Application (MVC): Добавляем связь manyToMany между пользователями, что позволит нам сформировать связи "канал-подписчик".
Код из видео:
github.com/drucoder/sweater/t...
Для добавления возможности подписываться на каналы мы должны добавить 2 поля в класс User: subscriptions и subscribers. Оба эти поля должны содержать Set пользователей и аннотированы @ManyToMany ссылающейся на одну и ту же таблицу user_subscriptions, но с противоположными значениями в аттибутах join_column и inverse_join_column.
Также нам нужно добавить миграцию, создащую таблицу для хранения связи многие-ко-многим.
После этого можно приступать к отображению количества подписок и подписчиков на странице пользователя и добавлению кнопок "подписаться/отписаться", а также страницы, отображающей списки подписок и подписчиков.
Для оформления используем стили bootstrap:
- кнопки "подписаться":
getbootstrap.com/docs/4.1/com...
- список пользователей:
getbootstrap.com/docs/4.1/com...
- отображение количества подписок:
getbootstrap.com/docs/4.1/com...
- отступы:
getbootstrap.com/docs/4.1/uti...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
➡ Твиттер: / letscodedru
➡ Чат в Discord: / discord
➡ Группа Вконтакте: letscodedru
➡ Канал в Telegram: t.me/letsCode_dru
➡ Чат в Telegram: t.me/joinchat/FeiP9xEhqHajfqh...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Поддержать проект:
➡ Patreon / letscodedru
➡ Яндекс.Деньги money.yandex.ru/to/4100145167...
➡ PayPal paypal.me/letscodedru
➡ Qiwi qiwi.me/letscode
➡ WebMoney/BitCoin funding.webmoney.ru/d/drucoder
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Ссылка на канал: / @letscodedru
Ссылка на Яндекс.Дзен: zen.yandex.ru/media/id/5ac209...

Пікірлер: 104

  • @D.P._
    @D.P._4 жыл бұрын

    "©Сам себя не похвалишь..." - подписчики похвалят! Спасибо, Отличные уроки!

  • @denisn2812
    @denisn28126 жыл бұрын

    Не перестану благодарить, реально даже слова благодарности тяжело подобрать. Огромнейшая ценность в том, что данный тутор свеж, не 15 или 16 год, а именно 18, просто бомба. Задам такой "наглый" вопрос, подскажи пожалуйста, через какой промежуток времени планируешь начать курс по REST-у? спасибо Да, и пора задуматься про кошелек, куда можно было бы благодарность сказать ;)

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    Rest начнётся до конца июня - это крайний срок. С пятницы начинаю подготовительные видео публиковать

  • @adiletzhuzupbekov9530
    @adiletzhuzupbekov95304 жыл бұрын

    просто топовый контент советую всем своим друзьям. Спустя год он так же актуален. Автор долгих и продуктивных лет тебе)))

  • @user-ih7yr2sj5y
    @user-ih7yr2sj5y3 жыл бұрын

    Самые качественные видео на эту тему, /и в рунете, и на англ/ Крутой подход, спасибо автору. Следовал видео и получилось сделать интересный проект, который любопытно "докручивать" самому. Советы автора помогают не утонуть в деталях и не потерять мотивацию. Спасибо ребятам в комментах - если вы напоролись на ошибку, решения находил здесь же. Успехов! Хватит читать комменты, идите кодить)

  • @nikitaantonenko3287
    @nikitaantonenko32875 жыл бұрын

    Спасибо огромное!))) Очень интересная и очень полезная информация)))

  • @TheLeony2
    @TheLeony26 жыл бұрын

    Все супер, продовжуй в тому дусі)Класно пояснюєш!

  • @andreiscurtu5908
    @andreiscurtu59084 жыл бұрын

    Низкий поклон за грамотный контент!!!

  • @D.P._
    @D.P._5 жыл бұрын

    Спасибо! Отличный и лаконичный материал!

  • @andrevero588
    @andrevero5885 жыл бұрын

    Каждое просмотренное мною видео кажется идеальным и каждое новое видео превосходит предыдущее - нет предела совершенству! Огромное спасибо. Отдельная благодарность за комментарии в конце видео.

  • @vladzagRussia
    @vladzagRussia5 жыл бұрын

    Самое лучшее что есть по спрингу во всем ютубе, спасибо вам!!!

  • @Vladislav4er
    @Vladislav4er6 жыл бұрын

    Спасибо большое за прекрасную серию роликов, все очень качественно! Когда закончил делать, заметил что у меня в navbar кнопка выхода/входа при авторизованном пользователе отображает надпись Sign out только на вкладке My messages, а на других было написано Log in, даже если я авторизован. Не знаю, может я где то невнимателен был, но я исправил это добавлением в файл parts/login.ftl

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    Норм, там есть упущения) И спасибо, что пишете не только о проблемах, но и как их решали. Мне это приятно, а кому-то может и пригодиться :)

  • @user-qy7yv1ut4c

    @user-qy7yv1ut4c

    3 жыл бұрын

    причем должно идти в самом начале, иначе он не отрабатывает

  • @alexdavydov3311
    @alexdavydov33115 жыл бұрын

    Очень круто! Спасибо)

  • @user-pz6ss6qo6y
    @user-pz6ss6qo6y4 жыл бұрын

    Топовый контент!

  • @victormog
    @victormog6 жыл бұрын

    Ну, о-о-очень быстро! :-) Буду позже с паузами пересматривать...

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    блин, видимо, ускоряюсь)) Постараюсь уменьшить темп на монтаже :)

  • @alexnick183

    @alexnick183

    5 жыл бұрын

    Да, было бы не плохо, если чуть медленнее! Спасибо!

  • @bek2074

    @bek2074

    5 жыл бұрын

    в Ютубе браузерном есть настройка скорости. Ну и конечно пауза. У меня 10-минутный урок на час растягивается - пока почитаешь, пока баги отловишь, пока по-своему сделаешь (стараюсь некоторые моменты сразу пытаться делать по-другому)

  • @user-dx9yq5js2c

    @user-dx9yq5js2c

    5 жыл бұрын

    Я тоже 15-минутный урок прохожу час-полтора. Это нормально.

  • @user-ds7to7qy8t
    @user-ds7to7qy8t5 жыл бұрын

    Подскажите пожалуйста, как в данной модели реализовать "друзья". Если есть взаимная подписка, то в messageList.ftl отобразить это. Иначе, как втюхать user.getSubscribers().contains(message.getAutor()) в . Или это всё намного сложнее и нужны познания в relationship mapping. Спасибо.

  • @alexandrguravskiy9985
    @alexandrguravskiy99855 жыл бұрын

    в macro - логаут забыли поместить для авторизованого пользователя кнопка Log in вместо Sign Out не осталась

  • @abaialihan9274

    @abaialihan9274

    5 жыл бұрын

    спасибо )

  • @user-qy7yv1ut4c

    @user-qy7yv1ut4c

    3 жыл бұрын

    спасибо

  • @kotnaoborot7422
    @kotnaoborot74226 жыл бұрын

    Great job, thanks a lot, man. And + one more vote for WebSockets.

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    Coming soon)

  • @andreyguzik2675
    @andreyguzik26755 жыл бұрын

    Огромное спасибо! Очень хотелось бы вы затронули тему тестирование в Spring Boot и TDD.

  • @letsCodeDru

    @letsCodeDru

    5 жыл бұрын

    Будет

  • @iosif88
    @iosif886 жыл бұрын

    Отличная подача материала! С нетерпением ждем видео по разработке веб-сервиса. Много ли времени занимает процесс подготовки, записи и монтажа одного видео ?

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    много, к сожалению. Поэтому видео не каждый день, а всего дважды в неделю.

  • @islandjava8077
    @islandjava80776 жыл бұрын

    Уроки супер!!! Хотелось бы еще больше информации по используемым технологиям и инструментам. Например, если используется та или иная встроенная возможность авторизации/шифрования паролей и т.д., то соответственно вопросы: а почему именно этот вариант выбран, какие еще есть, в каких случая рекомендуется использовать то или иное.

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    Этот цикл видео не про основательную подготовку специалистов, а про "куда начать копать, чтобы хоть что-то получалось". Если начать писать рассудительно, то мы бы еще даже до середины темы второго видео не дошли бы, поскольку одного Spring Core хватило бы штук на 10 видео, а у нас тут еще MVC, JPA, Security... Ну и истории из подробных видео не склеить - фантазии на все кейсы не хватит

  • @islandjava8077

    @islandjava8077

    6 жыл бұрын

    В общем огромное спасибо за работу!

  • @maksimbubnov1552
    @maksimbubnov15526 жыл бұрын

    Отлично получилось, за что спасибо! Единственное чего мне не хватило во всем это крутом приложении, это тестов(JUnit которые). Просто интересно, как они пишутся для приложений такого уровня (в плане использования технологий). Мои знания юнит-тестов = "ну чуть больше, чем для калькулятора)", отсюда интерес.

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    будут тесты

  • @wilmerfroilan8991
    @wilmerfroilan89916 жыл бұрын

    continue with the next video, please master ;)

  • @AlexandrKorneyko
    @AlexandrKorneyko6 жыл бұрын

    Андрей, привет. Шикарный курс! Архиреспект тебе! Я пока на 11-ом уроке, но впереди не вижу Websocket. Очень хотелось бы коснуться темы, ведь популярная штука! Спасибо.

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    Спасибо. Сокеты будут, но не в этом приложении. Мы тут js вообще не трогаем. Следующий цикл видео будет про rest, там оторвемся с js

  • @AlexandrKorneyko

    @AlexandrKorneyko

    6 жыл бұрын

    Будет JS ? Да это просто сказка!!!

  • @acealone3545
    @acealone35456 жыл бұрын

    Андрей, огромное спасибо за этот цикл видео! Было очень интересно и полезно. Осталась только парочка вопросов: как обезопасить БД от инъекций (если spring не обеспечивает такую защиту), и как защититься от XSS атак?

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    sql injection не страшен, если не пытаться создавать запросы через конкатенацию строк, а вот для обработки XSS нужно экранировать потенциально опасный код перед выводом на экран. Вот тут неплохо ответили stackoverflow.com/questions/5769847/how-to-avoid-apps-from-xss-attacks/5769859#5769859

  • @acealone3545

    @acealone3545

    6 жыл бұрын

    Спасибо! Думаю, больше всего здесь подойдёт использование HtmlUtils.htmlEscape() из Spring в методах, обрабатывающих данные, полученные из форм

  • @user-uw8ry8dy2t
    @user-uw8ry8dy2t5 жыл бұрын

    Крутой курс! Очень хотелось бы увидеть приложение вместе с тестами(junit, mockito, power mockito) и логирование, желательно с аспектами) И если бы это все подвязать с git, jenkins, sonarqube, можно в продакшн))

  • @letsCodeDru

    @letsCodeDru

    5 жыл бұрын

    Тесты будут, git на канале есть, Jenkins возможно будет, если придумаю, чем он лучше CircleCI, с остальным - подумаю

  • @user-zc3pq3vt5k
    @user-zc3pq3vt5k4 жыл бұрын

    Как всегда the best

  • @user-uz3ht6hv3r
    @user-uz3ht6hv3r6 жыл бұрын

    Здравствуйте. Спасибо за качественное видео. У меня вопрос не по теме немного. Поставлена задача реализовать ленту новостей которая должна поддерживать постраничный вывод новостей с регулируемым количеством новостей на странице: 10, 20 или 50. Не могу реализовать пока pagination для ленты. Как это возможно сделать c помощью Spring Boot?

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    Можно вот сюда глянуть для старта docs.spring.io/spring-data/rest/docs/2.0.0.M1/reference/html/paging-chapter.html

  • @user-ix7yf4uv7h
    @user-ix7yf4uv7h4 жыл бұрын

    отличные уроки, правда дойдя до 15 урока понимаю что не могу уже понять что к чему, видимо изза низкого знания основ Java. Жалко что автор по крайней мере до 15 урока не отразил кнопку удаления файла и скачивания его. Есть только загрузка файла. И было бы неплохо если файл сохранялся в директорию с именем пользователя. А так огромное спасибо, думаю смогу со временем осилить эту тему :)

  • @denyszvieriev3426
    @denyszvieriev34263 жыл бұрын

    Автор топ!))

  • @user-lb6cq6ib1i
    @user-lb6cq6ib1i2 жыл бұрын

    Ребята, помогите решить проблему: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2-5' for key 'user_subscriptions.PRIMARY' Возникаек когда подписываешься на второго человека, в Set-е становится два значения и при сохранении user-a sql не разрешает обновить Primery key

  • @islandjava8077
    @islandjava80776 жыл бұрын

    Не знаю к какому видео задать вопрос. Можно в ближайших видео затронуть тему "как правильно и на что опираться при формировании "адресных строк". Где, когда лучше использовать get, а где post.

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    вот про "формирование адресных строк" не понял вопрос. А про методы в "не-рест" приложении: get - на получение данных, post - на изменение.

  • @islandjava8077

    @islandjava8077

    6 жыл бұрын

    "..../4/33/545/.." или ..../?course=35&lesson=4&test=16.." возможно есть какие-то особенности, правила...

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    зависит от потребностей. Я стараюсь делать URL таким, чтобы можно было понять, что за параметры передаются

  • @islandjava8077
    @islandjava80775 жыл бұрын

    Столкнулся с такой проблемой. В контроллере получаю пользователя @AuthenticationPrincipal User user. И вот значения Ролей пользователя, подгружаются в user (как и в примере), а по второму значению Set (@ManyToMany) получаю "Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.". Возможно есть какие-то особенности, которые стоит учесть?

  • @YuretsUA

    @YuretsUA

    5 жыл бұрын

    Также столкрулся с проблемой, что для пользователя @AuthenticationPrincipal User currentUser не инициализированы поля messages, subscribers и subscriptions, пока ищу решение....

  • @zxzFaSTzxz
    @zxzFaSTzxz5 жыл бұрын

    Спасибо за видео. Есть в планах снять про pagination?

  • @letsCodeDru

    @letsCodeDru

    5 жыл бұрын

    Есть. Сниму)

  • @islandjava8077
    @islandjava80776 жыл бұрын

    В UserServece используется user.setPassword(password); вместо user.setPassword(passwordEncoder.encode(user.getPassword())); В результате в базу пишется пароль в исходном виде.

  • @aivazm2

    @aivazm2

    5 жыл бұрын

    Правильно! Только в аргументах не user.getPassword(), а password.

  • @mizantropoff
    @mizantropoff5 ай бұрын

    что то я где то упустил. после логина у меня снова отображается форма логина, но ведь так быть не должно, должно адресоваться на Main. Мы не делали свой контроллер для Логина, я так понимаю, использовали встроенный, как там настроить редайрект? Даже не совсем так. Когда я второй раз ввожу пароль (юзернэйм уже отсается заполненным - меня кидает на главную. Почему с первого раза не выходит?

  • @mizantropoff

    @mizantropoff

    5 ай бұрын

    Нашел ошибку. Добавил доступ к "/login" еще и в requestMatchers. Уже не помню как делал автор, но я подумал, раз мы при описании formLogin((form) -> form .loginPage("/login").permitAll(), то этого достаточно. Получается нет. Доступ надо открывать и в requestMatchers, и в .loginPage("/login").permitAll() В результате такая конфига SecurityChain (в 3 СпрингБуте ) public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((requests) -> requests .requestMatchers( "/", "/login", "/registration", "/img/**", "/static/**", "/activate/**").permitAll() //.requestMatchers("/user/**").hasAuthority("ADMIN") .anyRequest().authenticated() ) //.csrf(AbstractHttpConfigurer::disable) .formLogin((form) -> form .loginPage("/login").permitAll() ) //.logout(LogoutConfigurer::permitAll) .rememberMe((RememberMeConfigurer rm) -> rm .rememberMeParameter("remember_me") .tokenRepository(tokenRepository()) ) .getSharedObject(AuthenticationManagerBuilder.class)./*jdbcAuthentication() .dataSource(dataSource)*/userDetailsService(userService) .passwordEncoder(passwordEncoder) /*.usersByUsernameQuery("select username, password, active from user where username=?") .authoritiesByUsernameQuery("select u.username, ur.roles from user u inner join user_role ur on u.id = ur.user_id where u.username=?")*/ ; return http.build(); }

  • @AnnaSmirnova1
    @AnnaSmirnova14 жыл бұрын

    Андрей, скажите, пожалуйста, почему у некоторых fetch =Lazy срабатывает, у некотoрых запускается только через Eager??

  • @letsCodeDru

    @letsCodeDru

    4 жыл бұрын

    Не понял проблемы. Тут диалог нужен. Приходи в чат, там обсудим. Ссылка под видео есть

  • @AnnaSmirnova1

    @AnnaSmirnova1

    4 жыл бұрын

    @@letsCodeDru ок, сформулирую и обязательно приду))

  • @drankenwizard7602
    @drankenwizard76024 жыл бұрын

    такой вопрос: зачем делать эти миграции, где мы на sql создаем таблицы? разве хибернейт не делает это в тоже самое время?

  • @letsCodeDru

    @letsCodeDru

    4 жыл бұрын

    Создаёт. Но, иногда, он это делает так, что лучше бы и не делал. Миграции дают больший контроль.

  • @Romigo4

    @Romigo4

    3 жыл бұрын

    @@letsCodeDru а почему мы не создавали миграции, когда добавляли таблицы для хранения сессий ?

  • @krab9512

    @krab9512

    3 жыл бұрын

    @@Romigo4 потому что мы не контролируем сохранение сессии(это всё происходит под капотом), поэтому лучше это оставить hibernate.

  • @aleksei4604
    @aleksei46043 жыл бұрын

    top!

  • @evgenykuznetsov7490
    @evgenykuznetsov74902 жыл бұрын

    Подскажите как сделать миграцию для mysql, валится с такой ошибкой: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [subscriptions]

  • @user-vb4pj7su5x

    @user-vb4pj7su5x

    2 жыл бұрын

    Привет. нашел решение этой проблемы?

  • @YWNWA-ZXC
    @YWNWA-ZXC4 жыл бұрын

    кстати только сейчас заметил, что у меня в бд activation_code пустой везде. Хотя регистрация проходит. И еще на mail.ru или временной почте ссылка не рабочая(приходиться копировать), а в gmail все в поряде

  • @drankenwizard7602

    @drankenwizard7602

    4 жыл бұрын

    мы прописали что бы он удалялся с базы, когда почта активируется

  • @YuretsUA
    @YuretsUA5 жыл бұрын

    Никак не могу понять что не так, постоянно натыкаюсь на ошибку failed to lazily initialize a collection of role: com.yurets_y.entities.User.subscribtions, could not initialize proxy. для поля @AuthenticationPrincipal User currentUser, уже все танцы с бубном перепробовал, включая переключение способа авторизации на EAGER, перешарил весь stackoverflow, все поля many to many, many to one не инициализируются, создал костыль User user = userService.getById(currentUser.getId()), у пользователя user все поля нормальные, без ошибок. Такое чувство что spring-security не инициализирует эти данные.

  • @acsipa

    @acsipa

    5 жыл бұрын

    Та же история. Удалось решить?

  • @YuretsUA

    @YuretsUA

    5 жыл бұрын

    @@acsipa Нет, похоже это особенность Spring Security, смотрю автор также использует поле @AutentificationPrincipal User currentUser только для получения id и сравнения с пользователем, полученым через @PathVariable User user, подозреваю что все дело в том, что в Spring Security используется интерфейс UserDetails, который имплементирует класс User, поэтому Hibernate и не подгружает эти поля, даже если поставить EAGER инициализацию. Еще одно предостережение по поводу LazyLoadInitialization=false - никогда так не делать, если есть другое решение, если в базе будет целая туча подписок, подписчиков и сообщений то при обращении к одному сообщению по цепочке загрузит всю базу, что соответственным образом скажется на производительности.

  • @AnnaSmirnova1

    @AnnaSmirnova1

    4 жыл бұрын

    Подскажете, куда вы этот костыль поставили? Совсем запуталась.

  • @user-lk6ml2ol5x

    @user-lk6ml2ol5x

    4 жыл бұрын

    У меня проблема была в переопределённом hash - там нужен был только id

  • @juggernaut1680
    @juggernaut16806 жыл бұрын

    Можно попросить у Вас сделать видео с работой переменной типом Date или LocalDate или хотя бы помочь решить проблему в комментариях? А то у меня проблема с ней капец... Везде гуглю, ищу как преобразовать из фронтенда в контроллер и из него передать в базу... У меня код примерно такой получается: 1) В классе модели пищу так: @Entity public class Model{ private String name; private String description; @DateTimeFormat(pattern = "yyyy-MM-dd") // Это я указал от безысходности, не работает(( private Date date; } 2) Класс контроллер: @PostMapping public String add(@RequestParam String name, @RequestParam String description, @RequestParam String date, Map model) { SimpleDateFormat format = new SimpleDateFormat(); format.applyPattern("yyyy-MM-dd"); Product product = new Product( name, description, format.format(date)); @RequestParam String date - пытался сделать так: @RequestParam(value = "date", required = false) @DateTimeFormat(pattern="yyyy-MM-dd") Date date ошибки идут(( 3) Фронтенд : - обращение к контроллеру Наименование продукции Объем/Вес Дата поступления Итого: Получается, что с фронта нам в контроллер попадает тип String не зависимо от того, что указан type="date", приходится блин парсить стринг и потом уже записывать в базу данных.... А как быть если я хочу отредактировать сущность? Класс контроллер: @GetMapping("/{id}") -- Мапим новую страничку и передаем туда параметр id модели public String update(@PathVariable("id") int id, Model model) { model.addAttribute("repos", productRepos.findById(id)); return "update"; } @PostMapping("/updateUser") -- На открытой страничке пытаемся изменить данные public String updateUser(@ModelAttribute("repos") Product user) { productRepos.save(user); return "redirect:/"; } в метод пост приходит сущность, в которой data - null и тут уже начинается сыпаться все ошибками

  • @letsCodeDru

    @letsCodeDru

    6 жыл бұрын

    можно все входящие данные ложить в сущность, а вот дату получать строкой отдельным полем, парсить и подставлять в сущность. Чего-то у меня сходу рецепт в голове не всплывает, всё как-то json обрабатываю последнее время, а там проще с этим) Как придумаю - отпишусь сюда

  • @sasha_vosu4914
    @sasha_vosu49145 жыл бұрын

    для авторизованого пользователя кнопка Log in вместо Sign Out осталась.

  • @danibani200

    @danibani200

    4 жыл бұрын

    Можно логин форму вывести первой страницей, а после авторизации оставить все как есть.

  • @rhythmicpulse2760

    @rhythmicpulse2760

    Жыл бұрын

    Был ответ выше. В login.ftl:

  • @Sergei-kq8hk
    @Sergei-kq8hk2 жыл бұрын

    Подписки, подписчики, подписывайтесь... =)

  • @dreadsmaha1381
    @dreadsmaha13815 жыл бұрын

    подскажите, как 4 миграцию для mySQL прописать правильно?

  • @sergiypoddubka3545

    @sergiypoddubka3545

    4 жыл бұрын

    также интересует

  • @belsempai

    @belsempai

    4 жыл бұрын

    вот так сработало: create table user_subscriptions ( channel_id integer not null references usr, subscriber_id integer not null references usr, primary key (channel_id, subscriber_id) )

  • @drankenwizard7602

    @drankenwizard7602

    4 жыл бұрын

    вряд ли все ещё актуально, но все же)) просто допиши в ручную внешние ключи CONSTRAINT channel_id FOREIGN KEY (channel_id) REFERENCES user(id), CONSTRAINT subscriber_id FOREIGN KEY (subscriber_id) REFERENCES user(id)

  • @user-gj3rz7qv1l

    @user-gj3rz7qv1l

    2 жыл бұрын

    alter table user_subscription add CONSTRAINT channel FOREIGN KEY (channel_id) REFERENCES usr (id); alter table user_subscription add CONSTRAINT subscriber FOREIGN KEY (subscriber_id) REFERENCES usr (id); Вот только так оно от меня отъ***лось!!! Было ещё в начале create table user_subscription ( channel_id bigint not null, subscriber_id bigint not null, primary key (channel_id, subscriber_id) ) но писало user_subscription already exist

  • @YWNWA-ZXC
    @YWNWA-ZXC4 жыл бұрын

    у кого error 500, поставьте implements Serializable в User. у меня была ошибка сериализации

  • @AnnaSmirnova1

    @AnnaSmirnova1

    4 жыл бұрын

    В Message тоже лучше поставить

  • @starkoracia

    @starkoracia

    3 жыл бұрын

    Еще можно выключить .and() .rememberMe() в WebSecurity, залить на сервер, снова включить и снова залить )) Я так понимаю обнуляются сохраненные сессии пользователей...

  • @alexvadamov
    @alexvadamov5 жыл бұрын

    Предлагаю сохранение картинок перенести в БД, сделать авто-timestamp'ы на создание/редактирование юзеров. Пожжааалста.

  • @letsCodeDru

    @letsCodeDru

    5 жыл бұрын

    ложить картинки в БД - зло адское, делать так - низя! таймстампы - делаю в сарафане

  • @user-qy7yv1ut4c
    @user-qy7yv1ut4c3 жыл бұрын

    если не спринг сам не может обработать @PathVariable User user. - не может найти юзера по его айдишнику, то заместо того что бы работать с айдишником и самому вытаскивать юзера каждый раз можно создать глобальный конвертер: @Component public class UserConverter implements Converter { @Autowired private UserRepo userRepo; @Override public User convert(String source) { return userRepo.findById(Long.valueOf(source)).orElse(null); } }

  • @Romigo4

    @Romigo4

    3 жыл бұрын

    А в каких случаях Спринг не может сам найти юзера по Id ? просто тоже сталкивался с такой проблемой, и не могу понять от чего зависит невозможность сразу найти User

  • @user-lc7gw5py9v

    @user-lc7gw5py9v

    2 жыл бұрын

    У меня такая же проблема была. И разобраться с ней смог только тогда, когда понял, что в контроллер мы передаём {user}'а именно Стрингового и именно значение "main" (почему -так и не пойму), потому Пост-запрос не работал, как нужно. Выдавало ошибку 400 и невозможность конвертации со Стринга в ожидаемый Лонг. Поставил так: @Pathvariable String user - и порядок. Ну и плюс на выходе поставил редирект с user. Это был мой вариант...

  • @romanmanzhula9034

    @romanmanzhula9034

    Жыл бұрын

    @@user-lc7gw5py9v Тут, на мой взгляд, проще вместо Long userId оформить поле User user и воспользоваться геттером пользователя - "redirect:/user-messages/" + user.getId()

  • @user-qy7yv1ut4c
    @user-qy7yv1ut4c5 жыл бұрын

    Кто сталкивался с такой ошибкой ? ervlet.service() for servlet [dispatcherServlet] threw exception org.springframework.core.convert.ConversionFailedException: Failed to convert from type [byte[]] to type [java.lang.Object] for value

  • @starkoracia

    @starkoracia

    3 жыл бұрын

    Можно выключить .and() .rememberMe() в WebSecurity, залить на сервер, снова включить и снова залить )) Я так понимаю обнуляются сохраненные сессии пользователей...

  • @dmitry.23

    @dmitry.23

    2 жыл бұрын

    Перегрузить postgres сервис.

Келесі