powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Web-приложение, структура... что изменить, сделать проще, понятнее?
80 сообщений из 80, показаны все 4 страниц
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587180
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, я и так разберусь в проекте, но хотелось бы, чтобы человек с улицы пришел, сел и за пару часов вкурил :))

Что использую:
Maven, Hibernate, Spring MVC, БД (PostgreSQL хотя не суть).

Задумался над структурой, если у меня сейчас такое количество пакетов и папок, то что будет, когда их будет хотя бы 30, не говоря уже о 100. Это же будет огромные количества однотипных папок, с однотипными файлами и т.д. Хотя по структуре вроде как все логично.
Нужны будут REST-запросы, это 100%, и маппинг таблиц в бд из Entity-файлов, ну и остальные плюшки Hiber'а.

Может что-то с чем-то объединить? Или какой другой подход использовать?
Прикладываю скриншоты и код ниже.

.models.security.User.java Обычный Entity-файл
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof User)) {
            return false;
        }
        User other = (User) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "src.User[ id=" + id + " ]";
    }
}


.models.security.UserDao.java Интерфейс
Код: java
1.
2.
3.
4.
5.
6.
7.
import java.util.List;

public interface UserDao {

    public List<User> getAllUsers();

}


.dao.security.UserDaoImpl.java имплементация интерфейса
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Component
public class UserDaoImpl implements UserDao {
    @Override
    public List<User> getAllUsers() {
        return null;
    }
}


.dao.security.UserProvider.java

Код: java
1.
2.
3.
4.
5.
public class UserProvider {

// здесь будут разные методы, возвращающие листы данных по тем или иным параметрам.

}


UserController
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class UserController {

    private static final Logger log = Logger.getLogger(UserController.class);
    private UserDao userDao;

    @Autowired
    public UserController(UserDao userDao) {
        this.userDao = userDao;
    }

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    @ResponseBody
    public List<User> getAllUsers() {
//        List<User> usersList =
        return null;
    }
}

...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587181
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
развернули основные папки... :)
Здесь нельзя сразу несколько скринов прикрепить)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587182
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще один, последний...
поставил черточки маркером, чтобы визуально было проще разделить эту пачку папок
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587186
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да твоюж! имя пакета всё-таки спалил)))
В общем, хотел бы получить критику по самую не балуйся, а так же советы, кто как подобные проекты пишет так, чтобы было потом не больно в них разбираться :)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587190
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Устал уже повторять. Пакеты нужно организовывать по фичам приложения, а не по слоям.
https://www.google.com/search?q=package by feature not layer
Если у вас появляется однотипный код, его нужно рефакторить и инкапсулировать общую функциональность, чтобы когда её придётся править, её не пришлось бы править везде.
lombok - убираем все свойства и toString() из сущностей.
С hashCode(), кстати в ORM не тривиально. Если у вас сущности не сохранены ещё, то у них у всех hashCode 0. Может боком вылезти.
UserDaoImpl не нужен. Нужен Spring Data.
DAO не нужен. Нужен Repository. Это разные паттерны.

Что за UserProvider без бутылки не разобраться. Не хватает в имени класса ключевого слова из модели предметной области.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587191
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пакеты controllers, dao и models не нужны.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587192
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Называние UserProvider - ни о чем. Возможно имеется в виду Transaction Script, который инкапсулирует workflow модели предметной области?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587214
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczNixic,
Называние UserProvider - ни о чем. Возможно имеется в виду Transaction Script, который инкапсулирует workflow модели предметной области?
нет, нет, там будут методы аля:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public List<User> getAllUsers() throws SQLException {
        String sql = "from users ";
        usersList.clear();
        try (Connection c = DataSource.getConnection()) {
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        User user = new User();
                        user.setName(rs.getString("name"));
                    }
                }
            }
        }
        return  usersList;
    }


Только без ResultSet'а, будет, а Hibernate'овскими запросами, я пока не готов сходу написать пример, но суть такая, что именно в этом классе будет вытаскивание данных из бд в Листы.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587218
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczUserDaoImpl не нужен. Нужен Spring Data.
Неоднозначно. Проект на скрине это без спринга на хиберAPI.
Тогда пусть топик и проект выкинет.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587219
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public List<User> getAllUsers() throws SQLException {
        String sql = "from users ";
        usersList.clear();
        try (Connection c = DataSource.getConnection()) {
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        User user = new User();
                        user.setName(rs.getString("name"));
                    }
                }
            }
        }
        return  usersList;
    }



Это DAO.

NixicТолько без ResultSet'а, будет, а Hibernate'овскими запросами, я пока не готов сходу написать пример, но суть такая, что именно в этом классе будет вытаскивание данных из бд в Листы.
Для CRUD отдельного слоя не нужно. Для сложных запросов - Repository. Смотри Spring Data.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587222
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczNixic,
Называние UserProvider - ни о чем. Возможно имеется в виду Transaction Script, который инкапсулирует workflow модели предметной области?
Почитал паттерн, да, именно это и имелось ввиду :)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587226
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Чет я не понял.
Если хиберAPI то будет маппинг и session.saveORUpdare
Или ,springData?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587229
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic
Код: java
1.
2.
3.
while (rs.next()) {
                        User user = new User();
                        user.setName(rs.getString("name"));


Это вообще за гранью.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587230
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Nixic,
Чет я не понял.
Если хиберAPI то будет маппинг и session.saveORUpdare
Или ,springData?
По идее, я хотел бы создавать свои сущности, не заботиться при этом о БД, и вообще поменьше в нее заходить по ходу разработки.
Но в дальнейшем, возможно, эта необходимость отпадет и поля с таблицами будут добавляться в БД руками.
Вообще, я так понимаю, нужно смотреть в сторону Spring Data, уже открыл пару ссылок :)

А что, получается, что либо маппинг сущностей в БД, либо Spting Data? Одно исключает другое?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587233
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУстал уже повторять. Пакеты нужно организовывать по фичам приложения, а не по слоям.
https://www.google.com/search?q=package by feature not layer

Спасибо, это мы уже пару тройку лет назад обсуждали, да!)) но повторение мать сами знаете, кого )) Спасибо, перекидаю согласно бизнес-логики.
Blazkowiczlombok - убираем все свойства и toString() из сущностей.

Да, я его как-то пробовал, мне понравилось, хотя некоторых раздражает то, что кода не видно)
BlazkowiczС hashCode(), кстати в ORM не тривиально. Если у вас сущности не сохранены ещё, то у них у всех hashCode 0. Может боком вылезти.

Понял, пример создан на основе темплейта из Нетбинса, там он именно так генерится.
BlazkowiczUserDaoImpl не нужен. Нужен Spring Data.
DAO не нужен. Нужен Repository. Это разные паттерны.
Уже читаю, спасибо.

Кстати, это у меня не коммерческий проект, хоть там и сущности аля Контрагент, пакеты Отдела продаж, Снабжения, а попытка в свободное от работы на работе время, переписать основу старого своего проекта, где по возможности нужно использовать наиболее популярные технологии, приемы, паттерны и т.д. Ну а дальше уже перейти к клиентской части и там использовать что-то из современных JS фреймворков/библиотек, React JS в частности, хочу в нем использовать
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587238
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Nixic
Код: java
1.
2.
3.
while (rs.next()) {
                        User user = new User();
                        user.setName(rs.getString("name"));


Это вообще за гранью.
Да я не дописал)) и вообще не буду этим пользоваться) Написано же) Ладно хоть точки с запятой поставил)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587239
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Код: java
1.
2.
Query query = session.createQuery("FROM Developer");
   List developers = query.list();
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587241
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicА что, получается, что либо маппинг сущностей в БД, либо Spting Data? Одно исключает другое?да.
Выбирай.
Золотой пули нету.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587243
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Nixic
Код: java
1.
2.
3.
while (rs.next()) {
                        User user = new User();
                        user.setName(rs.getString("name"));


Это вообще за гранью.
А кстати, что тут такого? Берем создаем юзера, из резултСета тянем имя, сеттим ему имя, потом тут же надо было дописать,
кладем его в лист.
потом этот лист возвращаем и используем, вроде как обычно... нет?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587247
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
В цикле это jdbc
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587250
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicА что, получается, что либо маппинг сущностей в БД, либо Spting Data? Одно исключает другое?
Вы кажется недочитали про Spring Data. Это удобная обертка над JPA, чтобы избавится от всякого повторяющегося однотипного кода, о котором вы спрашиваете. А JPA, соответсвенно API, например, к Hibernate.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587254
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Где то тема была, обсуждали предпочтения.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587255
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это да, еще не прочитал совсем ничего почти :)
Пойду читать про Spring Data, раскидывать пакеты/классы по слоям по БЛ, подключать lombok... :)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39587265
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Спринге больше магии. Нравится, делай. Если нет, то хиберApi.
Удачи.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39588017
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicЭто да, еще не прочитал совсем ничего почти :)
Пойду читать про Spring Data, раскидывать пакеты/классы по слоям по БЛ, подключать lombok... :)

Заодно про реализацию HATEOS в Spring...
Чтобы REST-контроллеры не писать :-)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39594285
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкинуть нахер жаву :)

И тогда будет вот это (это лишь один из вариантов, код руби, но есть и другие альтернативе если руби не нравится).

Код: ruby
1.
2.
3.
4.
5.
6.
class User
  include MongoMapper::Document

  key :id,   Integer
  key :name, String
end



Вместо этой портянки

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof User)) {
            return false;
        }
        User other = (User) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "src.User[ id=" + id + " ]";
    }
}
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39594294
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,
Теперь на хибер API дай и удивись)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39594562
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

А можно писать так
Код: java
1.
2.
3.
4.
5.
6.
7.
@Entity
data class(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Int? = null,
    var name: String? = null
)



При этом можно использовать все библиотеки и фреймворки Java

<:o)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39594881
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно - на многих языках можно создавать компактно и просто. Например жаваскрипт современный практически не уступает руби по компактности и мощности, а с ТайпСкриптом даже еще и надежней становится с типами. И котлин тоже неплох.

Но почему-то весь реальный код на жава (и котлин там-же) - это портянки как в примере выше. Вот реально не найти на гитхабе проекта на жаве где бы

- не было длиннющих переменных на полстроки, и вообще линий длинных
- кучи скобок
- фактори билдер провайдер медиейтор стратеджи - и т.п.
- хорошо отформатированного кода, где аттрибуты и пр. сгруппировано так чтобы было компактно и легко читать.

Вот даже в твоем примере, смотри, можно его улучшить
Код: java
1.
2.
3.
4.
5.
6.
@Entity
data class(
  @Id @GeneratedValue(strategy = GenerationType.AUTO)
  var id:   Int?    = null,
  var name: String? = null
)



Но нет, ты даже не потрудился поставить отступы чтобы читать было проще, размазал код по странице так как идея отформатировала от балды и готово.

В этом проблема, жава проекты и жава код - это какая-то мазня на которую неприятно смотреть. Как боливудские фильмы - вроде сюжет тот-же, но не то.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39594893
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateВ этом проблема, жава проекты и жава код - это какая-то мазня на которую неприятно смотреть.Нехватка синтаксического сахара порождает boilerplate ©
privateКак боливудские фильмы - вроде сюжет тот-же, но не то.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39594908
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateНо нет, ты даже не потрудился поставитьты сам трудился?
Нафига ты вывалил код первый попавшийся?
Я согласен что java многословен, но сравнивать с js глупо.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602126
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спустя две недели удалось вернуться к проекту, не то, чтобы работы куча, а просто как-то отвлёкся ))
Два дня назад решил-таки подключить Spring Data JPA и... провозился 1.5 дня с чтением документации и стековерфлоу, потому как я не понимал, почему везде в книгах и в доках интерфейс @Autowired без реализации, а у меня всё то же самое и выдает ошибку.
В итоге на одном из форумов увидел, что JPA 2+ требует Spring 5-й версии, а я юзал 4-й.

теперь такие версии подключил и всё взлетело
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
         <properties>
               <spring.version>5.0.3.RELEASE</spring.version>
        </properties>

       <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>


Код: java
1.
2.
3.
4.
5.
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface UserRepository extends CrudRepository<User, Integer> {
    List<User> findByName(String name);
}


Над этим текстом код репозитория, а теперь вот такой вопрос, если я, захочу использовать, добавить свои сигнатуры методов с именованием не аля findPhoneNumber(String phoneNumber), который по имени метода, вроде как должен построить автоматом запрос, хотя я не уверен из-за кемелКейса в имени метода... А что-то типа getUserByHisName() имя так себе, но не смог ничего прямо сейчас придумать :)
Получается, что если спринг не сможет сгенерить запрос, то надо где-то его реализацию сделать, правильно?

Сейчас у меня в контроллере указано так:
Код: java
1.
2.
    @Autowired
    private UserRepository userRepository;


ну и метод, какой-никакой)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    @RequestMapping(value = "/usersSData", method = RequestMethod.GET)
    @ResponseBody
    public List<User> getUserWithSpringData(@RequestParam(value = "userName", required = false) String name) {
        userList.clear();
        userList = userRepository.findByName(name);
        for (User u : userList) {
            Integer id = (Integer) u.getId();
            String userName = (String) u.getName();
            log.info("id:" + id + ", name:" + userName);
        }
        return userList;
    }


имя такое, потому что тут же в методе используются варианты для REST запросов. Через Criteria и просто через
Код: java
1.
Query q = em.createQuery("select u from User as u");



Должен ли я теперь создать отдельный класс аля UserDao, затем добавить его реализацию UserDaoImpl и использовать именно её...
Или же, есть какой-то вариант, использовать всё тот же интерфейс без явной реализации UserRepository, но как, кажется это нереально?
Как бы это всё покрасивше сделать?
Спасибо :)

п.с. HATEOAS посмотрел, попозже, возможно, добавлю, пока разберусь с Spring Data :)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602131
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123NixicА что, получается, что либо маппинг сущностей в БД, либо Spting Data? Одно исключает другое?да.
Выбирай.
Золотой пули нету.
Кстати, я тут это... у меня и то и то используется :) То есть я могу смапить всё что есть и одновременно юзать Spring Data.
Правда тут получается что у меня в двух местах сейчас прописана EntityManagerFactory:

в файле с настройками и бинами
и
в так называемом классе HibernateUtil где EntityManagerFactory создается на основании persistence.xml

ладно хоть и там и там датасорс подтягивается через jndi из томката.
Не знаю, насколько это кашерно, но работает...
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602138
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicНе знаю, насколько это кашерно, но работает...какой смысл на двух стульях сидеть?
Выбери где меньше кода и закрывай тему.
Тема то про выбор, а не написание проекта.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602185
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123NixicНе знаю, насколько это кашерно, но работает...какой смысл на двух стульях сидеть?
Выбери где меньше кода и закрывай тему.
Тема то про выбор, а не написание проекта.
Просто я люблю сначала всех посмотреть)
И как понять, где меньше кода при определенных потребностях, если не пробовать писать проект.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602187
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Сейчас приведи код сюда со всеми конфигами спринг и без спринга хибер api.
Результат не виден.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602262
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
persistence.xml
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
        <!--/////// это юзаем когда создаем entityManagerFactory.createEntityManager(); из HibernateUtil -->
        <!--<non-jta-data-source>java:comp/env/jdbc/postgres</non-jta-data-source>-->
        <!-- а если нужны логи...-->
        <non-jta-data-source>java:comp/env/jdbc/postgresLogged</non-jta-data-source>
        <!--///////-->
        <properties>

            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL95Dialect"/> <!-- DB Dialect -->
            <property name="hibernate.hbm2ddl.auto" value="update" /> <!-- create / create-drop / update -->
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.physical_naming_strategy" value="com.opalev.config.PhysicalNamingStrategyImpl"/>

            <property name="hibernate.jdbc.lob.non_contextual_creation" value="true"/>
        </properties>
    </persistence-unit>

</persistence>


pom.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.opalev</groupId>
    <artifactId>ph</artifactId>
    <packaging>war</packaging>
    <version>3.0-SNAPSHOT</version>

    <properties>
        <hibernate.version>5.2.12.Final</hibernate.version>
        <spring.version>5.0.3.RELEASE</spring.version>
        <log4j.version>1.2.17</log4j.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java-version>1.8</java-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.1</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4-1202-jdbc42</version>
            <!--версия 9.4-1202-jdbc42 подходит для postgres 10.1 jdk 1.8 -->
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.2.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-digester/commons-digester -->
        <dependency>
            <groupId>commons-digester</groupId>
            <artifactId>commons-digester</artifactId>
            <version>2.1</version>
        </dependency>

        <!-- Log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <!--<dependency>-->
        <!--<groupId>org.slf4j</groupId>-->
        <!--<artifactId>slf4j-api</artifactId>-->
        <!--<version>1.7.25</version>-->
        <!--</dependency>-->
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <scope>compile</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.googlecode.log4jdbc/log4jdbc -->
        <dependency>
            <groupId>com.googlecode.log4jdbc</groupId>
            <artifactId>log4jdbc</artifactId>
            <version>1.2</version>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.4</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java-version}</source>
                    <target>${java-version}</target>
                    <!--<compilerArgument>-Xlint:all</compilerArgument>-->
                    <compilerArgument>-Xlint:-processing</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


WebConfig.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

@Configuration
@EnableWebMvc
@ComponentScan("com.opalev")
@EnableJpaRepositories(basePackages = "com.opalev", entityManagerFactoryRef = "emf")
@Log4j
public class WebConfig extends WebMvcConfigurerAdapter {


    @Autowired
    private Environment environment;
    @Autowired
    private ApplicationContext applicationContext;
    private static DataSource dataSource;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/WEB-INF/**").addResourceLocations("");
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
//        registry.addResourceHandler("/bootstrap/**").addResourceLocations("/resources/");
    }

    @Bean
    public InternalResourceViewResolver setupViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public HibernateUtil setupPostProcessor() {
        return new HibernateUtil();
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        if (dataSource == null) {
            try {
                Context ctx = new InitialContext();
//                dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/postgres");
                dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/postgresLogged"); // если хотим логирование log4jdbc, т.е. для дева.
            } catch (NamingException e) {
                log.error("Хм.. ошибка какая-то: " + e);
            }
        }
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean emf() throws NamingException {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(dataSource());
        emf.setPersistenceUnitName("PU");
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(true);
        hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQL95Dialect");
        emf.setJpaVendorAdapter(hibernateJpaVendorAdapter);
        emf.setPackagesToScan("com.opalev");
        return emf;
    }

}



HibernateUtil.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
import org.springframework.context.annotation.Bean;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.criteria.CriteriaBuilder;
import java.io.Serializable;

public class HibernateUtil implements Serializable {

    private static final long serialVersionUID = 1L;
    private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PU");

    @Bean
    public static EntityManager getEntityManager() {
        return entityManagerFactory.createEntityManager();
    }

    @Bean
    public static CriteriaBuilder getCriteriaBuilder() {
//        emf = Persistence.createEntityManagerFactory("PU");
        CriteriaBuilder builder = entityManagerFactory.getCriteriaBuilder();
        return builder;
    }
}


User.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
import lombok.EqualsAndHashCode;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@EqualsAndHashCode
@Table(name = "users")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private String email;
    private String homeAddress;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    @Override
    public String toString() {
        return "src.User[ id=" + id + " ]";
    }
}


UserRepository.java
Код: java
1.
2.
3.
4.
5.
6.
import org.springframework.data.repository.CrudRepository;

import java.util.List;
public interface UserRepository extends CrudRepository<User, Integer> {
    List<User> findByName(String name);
}



UserController.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
import com.opalev.config.HibernateUtil;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

@Controller
@Log4j
public class UserController {

    private List<User> userList = new ArrayList<>();

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(value = "/usersCR", method = RequestMethod.GET)
    @ResponseBody
    public List<User> getUsersWithCriteria() {

        log.info("подтянем юзеров используя Criteria ");
        EntityManager em = HibernateUtil.getEntityManager();
        CriteriaBuilder builder = HibernateUtil.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
        Root<User> usersRoot = criteriaQuery.from(User.class);
        criteriaQuery.select(usersRoot);
        criteriaQuery.where(builder.like(usersRoot.get("name"), "%admin%"));
        criteriaQuery.orderBy(builder.desc(usersRoot.get("id")));

        userList.clear();
        userList = em.createQuery(criteriaQuery).getResultList();
        log.info("userList: " + userList);
        for (User u : userList) {
            Integer id = (Integer) u.getId();
            String name = (String) u.getName();
            log.info("id:" + id + ", name:" + name);
        }
        return userList;
    }

    @RequestMapping(value = "/usersCQ", method = RequestMethod.GET)
    @ResponseBody
    public List<User> getUsersWithEntityManager() {
        System.out.println("подтянем юзеров используя createQuery ");
        EntityManager em = HibernateUtil.getEntityManager();
        try {
            Query q = em.createQuery("select u from User as u order by u.id desc");
            userList.clear();
            userList = q.getResultList();
            log.info("userList: " + userList.size());
            return userList;
        } catch (NoResultException ex) {
            log.info("exception: " + ex);
            return null;
        } finally {
            em.close();
        }
    }

    @RequestMapping(value = "/usersSData", method = RequestMethod.GET)
    @ResponseBody
    public List<User> getUserWithSpringData(@RequestParam(value = "userName", required = false) String name) {
        userList.clear();
        userList = userRepository.findByName(name);
        for (User u : userList) {
            Integer id = (Integer) u.getId();
            String userName = (String) u.getName();
            log.info("id:" + id + ", name:" + userName);
        }
        return userList;
    }

}



context.xml в Tomcat'е 9-м в папке conf
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
	 <Resource name="jdbc/postgresLogged" auth="Container"
         type="javax.sql.DataSource" driverClassName="net.sf.log4jdbc.DriverSpy"
         url="jdbc:log4jdbc:postgresql://127.0.0.1:5432/ph"
         username="user" password="12345678" maxIdle="10"/>
		 
	<Resource name="jdbc/postgres" auth="Container"
         type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
         url="jdbc:postgresql://127.0.0.1:5432/ph"
         username="user" password="12345678" maxIdle="10"/>



Вроде всё
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602268
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Большая работа).
Без спринга, на хибере вроде в 2 раза меньше кода?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602275
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Если для вывода фио юзверя надо 1500 строк руками, фигово ты выбирал.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602285
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне просто в свободное время нужно было попробовать некоторые варианты, которые вдруг когда-нибудь понадобятся.
Ну и плюс, можно сказать потом, что да, работал с этим.
Ну и второй раз разбираться, даже спустя время или даже ВРЕМЯ)) все равно легче, тем более если будет лежать пример использования в своих заначках.

Про большую работу я понял, что сарказм) Но с чего-то надо начинать.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602319
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Ну, для себя это понятно.
А для других показал ужасы java.
На jdbc 3 !!!!! строки кода.
У тебя 1500 строк, причем ручного кода.
Удачи!
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602338
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
огромное спасибо!!
теперь у меня есть ссылка для демонстрации разницы моего подхода и "стандартного"
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602344
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Он пока троечник))). А ты?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602357
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадя,
Он пока троечник))). А ты?у меня хватает мозгов чтоб не делать такое, а заранее представить это. и оценить время и затраты.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602365
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяменя хватает мозгов-1
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602378
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не используйте интерфейсы для бинов. Они не нужны. Интерфейсы нужны были в старых EJBях ибо прокси создавались через java.lang.reflect.Proxy. В спринге этого не требуется, можно инжектить сразу реализации.

Уберите гетеры и сетеры из ентитей. Они там не нужны - вы всё равно не будете переопределять логику внутри.
Вообще используйте гетеры и сетеры по минимуму - антипаттерн. Инжекте сразу в приватные поля.

Названия пакетов можно сократить если вы не собираете библиотеки.

Спринг дружит с хибернейтом, есть хелперы.

Не юзайте criteria api - код превращается в месиво и сложно отлаживать запросы в БД. Лучше создавайте naming queries.

Не переопределяйте equals и hashCode без надобности.

Функциональная декомпозиция лучше послойной.

Тесты пишутся в директории src/main/test а код в src/main/java.

Если юзаете автосканинг, то будет долго стартовать.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602388
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, учту, кое что уже поправил, в частности
unregesteredТесты пишутся в директории src/main/test а код в src/main/java.
сейчас так, а тесты не пишу, пока
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602390
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В идее можно настроить чтобы *.iml были внутри .idea директории
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602408
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicPetro123Nixic,
Чет я не понял.
Если хиберAPI то будет маппинг и session.saveORUpdare
Или ,springData?
По идее, я хотел бы создавать свои сущности, не заботиться при этом о БД, и вообще поменьше в нее заходить по ходу разработки.
Но в дальнейшем, возможно, эта необходимость отпадет и поля с таблицами будут добавляться в БД руками.
Вообще, я так понимаю, нужно смотреть в сторону Spring Data, уже открыл пару ссылок :)

А что, получается, что либо маппинг сущностей в БД, либо Spting Data? Одно исключает другое?

Никогда не создавайте ничего руками. Все sql-скрипты должны быть упорядочены и храниться в репозитории
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602411
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregesteredВсе sql-скриптыпока нет необходимости писать select вообще.
Так?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602416
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unregesteredВсе sql-скриптыпока нет необходимости писать select вообще.
Так?

Не понял вопроса. Я про модификацию структуры БД и миграцию данных.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602426
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregestered,
Нету этого в java.
В шарпе есть.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602428
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил косяк)

Если добавить в сущность User поле:
Код: java
1.
2.
@OneToMany(fetch = FetchType.LAZY)
    private List<Contact> contact = new ArrayList<>();


Кстати, не уверен, что нужно new... поправьте.
То будет вываливаться ошибка:
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: блаблабла Could not write JSON: failed to lazily initialize a collection of role: блаблабла

Оказалось нужно добавить в WebConfig менеджера транзакций
Код: java
1.
2.
3.
4.
    @Bean
    public PlatformTransactionManager transactionManager() throws NamingException {
        return new JpaTransactionManager(emf().getObject());
    }


И в нем же выше исправить аннотацию так:
Код: java
1.
@EnableJpaRepositories(basePackages = "com.opalev", entityManagerFactoryRef = "emf", transactionManagerRef = "transactionManager")


Скорее всего это лишнее, потому что мне кажется, что спринг бы искал его именно по этому же имени, лень проверять, конкретизировал на всякий случай имя.
В контроллере нужно при этом добавить аннотацию
@Transactional

Какая ж все-таки запутанная схема :)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602435
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicКакая ж все-таки запутанная схема :)ты же без спринга не пробовал.
Каждому своё.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602438
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unregestered,
Нету этого в java.
В шарпе есть.

Не врубился: чего нет в джаве.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602450
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregestered,
В энтерпрайзе проектах чаще бд уже есть или делается своими инструментами.
Т.е. к этому топику отношения не имеет. IMHO.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602451
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123NixicКакая ж все-таки запутанная схема :)ты же без спринга не пробовал.
Каждому своё.
Как не пробовал :) - два проекта по 80+ сущностей без спринга)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602455
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unregestered,
В энтерпрайзе проектах чаще бд уже есть или делается своими инструментами.
Т.е. к этому топику отношения не имеет. IMHO.

Да шо вы говорите. Наверное самозарождается, не иначе.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602457
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregesteredPetro123unregestered,
В энтерпрайзе проектах чаще бд уже есть или делается своими инструментами.
Т.е. к этому топику отношения не имеет. IMHO.
Да шо вы говорите. Наверное самозарождается, не иначе.
Имелось ввиду, что когда приходишь на проект не с нуля, то уже есть БД.
или если с нуля, то есть Базисты, БДэшники, которые рулят БД, а джависты пилят под неё свой проект. А потом и то и то подстраивается друг под друга. А не магическое появление БД из мирового эфира))
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602459
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Он делает магией hiber.hbm2dll.ShemaExport каждый раз приходя на работу.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602498
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю про что тут речь идёт. В большинстве проектов с которыми работал БД создавалась либо модифицировалась разработчиками.
Ни разу не приходилось кого-нибудь дёргать чтобы БД поменять. Делаются бекапы и мигрируется что нужно.
Админы не в курсе как системы работают, их задача обслуживание, ничего править в БД самовольно они не будут
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602505
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregesteredАдмины не в курсе как системы работают, их задача обслуживание, ничего править в БД самовольно они не будутну дак маленькая организация).
В большой вам даже логин не дадут на create table, trigger...
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602544
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unregesteredАдмины не в курсе как системы работают, их задача обслуживание, ничего править в БД самовольно они не будутну дак маленькая организация).
В большой вам даже логин не дадут на create table, trigger...

К девелоперской базе есть доступ на запись у разработчиков (иначе как работать). Все скрипты комитятся в гит, которые потом накатываются на продакшен миграционными утилитами.
Что в маленькой, что в большой.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602558
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregesteredК девелоперской базе есть доступ на запись у разработчиков (иначе как работать). Все скрипты комитятся в гит, которые потом накатываются на продакшен миграционными утилитами.
Что в маленькой, что в большой.

Точнее: скрипты комитятся в гит, делается релиз бренч всего кода (sql, java, файлы). Бренч тестируется на тестовой и затем на UAT (включая load и stress тесты). И затем всё это дело накатывается деплоймент утилитами. Никакого логина не надо: весь деплоймент происходит по нажатию кнопки.

Никто не будет лезть в продакшен базу меняя по наитию триггеры туда-сюда.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602569
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregesteredдеплоймент утилитами.кем и с каким логином?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602602
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFF
unregesteredНикакого логина не надо: весь деплоймент происходит по нажатию кнопки.вот как вас пускать к БД какого нибудь завода или банка, если вы бд не знаете. Только кнопку.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602683
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123кем и с каким логином?
Например админом. Но продакшен база напрямую не трогается.

Petro123OFF
unregesteredНикакого логина не надо: весь деплоймент происходит по нажатию кнопки.вот как вас пускать к БД какого нибудь завода или банка, если вы бд не знаете. Только кнопку.

Почему? Дев база имеет аналогичную структуру. Это во-первых. А во-вторых есть такая замечательная штука как рид-онли акцесс.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602686
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateМожно - на многих языках можно создавать компактно и просто. Например жаваскрипт современный практически не уступает руби по компактности и мощности, а с ТайпСкриптом даже еще и надежней становится с типами. И котлин тоже неплох.

Но почему-то весь реальный код на жава (и котлин там-же) - это портянки как в примере выше. Вот реально не найти на гитхабе проекта на жаве где бы

- не было длиннющих переменных на полстроки, и вообще линий длинных
- кучи скобок
- фактори билдер провайдер медиейтор стратеджи - и т.п.
- хорошо отформатированного кода, где аттрибуты и пр. сгруппировано так чтобы было компактно и легко читать.


Это бывает когда мидл девелоперы начитаются книжек про паттерны и начинают их клепать где не попадя.
А всё остальное: про переменные скобки и пр - от недостатка опыта.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602701
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregestered,
Давайте ближе к теме.
Зачем в демке выше писать руками select трали вали?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602764
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unregestered,
Давайте ближе к теме.
Зачем в демке выше писать руками select трали вали?

Я вам не баба чтобы что-то вам давать
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602767
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregestered,
Тогда не флуди.
Половину поста верно ты подметил. А про именованные запросы нет.
Удачи!
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602961
unregestered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что не так с именованными запросами. Ну можно и так ембедить. Самое главное - без критерия апи.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39602977
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unregesteredА что не так с именованными запросами. Ну можно и так ембедить. Самое главное - без критерия апи.
Там критерия по ТЗ и не нужно.
Но автору пофиг. Он самоустранился.
А зачем нам больше него работать).
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603009
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123unregesteredА что не так с именованными запросами. Ну можно и так ембедить. Самое главное - без критерия апи.
Там критерия по ТЗ и не нужно.
Но автору пофиг. Он самоустранился.
А зачем нам больше него работать).
Не стыдно и помолчать, коли нечего сказать )

По поводу ТЗ, ТЗ нет, я просто сделал проект для изучения возможностей, для выстраивания костяка так сказать, для какого-то типового для меня лично, проекта.
Кстати, прикрутил HATEOAS прикольная вещь, только вот к Entity оно не прикручивается, там надо расширять класс org.springframework.hateoas.ResourceSupport; А у него уже есть метод getId(), поэтому получается попа.
Выкрутился тем, что создал трансиентное поле в классе сущности:
@Transient
private List<Link> _links;

Link это вот эта вот: org.springframework.hateoas.Link;

Кроме того, оказалось, что Hibernate не любит по умолчанию трансиентные поля и пришлось добавить в конфиг:
hm.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                Hibernate5Module hm = new Hibernate5Module();
              hm.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
                mapper.registerModule(hm);
                // replace Hibernate5Module() with the proper class for your hibernate version.
            }
        }
    }



Ссылку формирую в контроллере так:
Кину с мусором и с кривыми названиями запросов, но суть не в этом. В частности Resource userResource = new Resource(user);
здесь лишнее, но пока пусть лежит, надо изучить получше и потом удалить или как-то использовать.
getUsersContact как бы совсем не контакт, но не суть :))
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 @RequestMapping(value = "usersContact", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseBody
    public List<User> getUsersContact(@RequestParam(value = "userName", required = false) String name) {
        userList.clear();
        userList = Lists.newArrayList(userRepository.findAll());
        List<User> userListWithLinks = new ArrayList<>();
        for (User user : userList) {
            Resource userResource = new Resource(user);
            Link link = linkTo(UserController.class).slash(user.getId()).withSelfRel();
            userResource.add(link);

            User userWithLinks  = (User)userResource.getContent();
            List<Link> links  = userResource.getLinks();
            userWithLinks.set_links(links);

            userListWithLinks.add(userWithLinks);
            Integer id = (Integer) userWithLinks.getId();
            String userName = (String) userWithLinks.getName();
            log.info("id:" + id);
            log.info("name:" + userName);


            contactsList = userWithLinks.getContact();
            if (contactsList != null && !contactsList.isEmpty()) {
                for (Contact c : contactsList) {
                    log.info("Контакт: " + c.getEmail());
                }
            }
        }
        return userListWithLinks;
    }




теперь получилась вот такая вот красотища на выходе :)
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603015
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати Spring Data JPA вообще отличная вещь!
Вот обновление поля например, никаких там апдейт, маппинга и прочего, save и всё! :)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    @RequestMapping(value = "/updateUserName", method = RequestMethod.GET)
    @ResponseBody
    public List<User> updateUserName(@RequestParam(value = "id", required = false) Integer userId, @RequestParam(value = "name", required = false) String newName) {
        userList.clear();
        User user = userRepository.findById(userId).get();
        if (newName != null && !"".equalsIgnoreCase(newName)) {
            user.setName(newName);
            userRepository.save(user);
        }
        userList.add(user);
        return userList;
    }



Мне прям очень понравилось.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603047
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicВот обновление поля например, никаких там апдейт, маппинга и прочего, save и всё! :)
Че за ерунда?
С чем сравнил?
- без маппинга не бывает
- в хибер api тоже самое, но ты его не делал
- код в тыщу строк ты написал. С чего радость?
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603060
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicНе стыдно и помолчать, коли нечего сказать )топик, как я встал и что завтракал, никому не интересен).
Вот и помолчи ....не по делу.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603109
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123NixicНе стыдно и помолчать, коли нечего сказать )топик, как я встал и что завтракал, никому не интересен).
Вот и помолчи ....не по делу.
Дак я вроде молчал, не?)
Умолкаю, надеюсь, кому-то да пригодится. Закрываемся.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603127
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicДак я вроде молчал, не?)не. Ты продолжил накидывать больше кода в примере Hello world.
Счас придет вадя и скажет что ОРМ это прокладка Г на тыщу строк.
...
Рейтинг: 0 / 0
Web-приложение, структура... что изменить, сделать проще, понятнее?
    #39603249
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Счас придет вадя и скажет что ОРМ это прокладка Г на тыщу строк.а надо?
...
Рейтинг: 0 / 0
80 сообщений из 80, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Web-приложение, структура... что изменить, сделать проще, понятнее?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]