Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate 5 и Desktop приложение / 25 сообщений из 46, страница 1 из 2
18.12.2019, 00:29
    #39904415
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Есть JavaFX Desktop приложение.
Возникла необходимость прикрутить бд.

Вот что сделал я:

Настройка самого Хибера:


Код: 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.
public final class HibernateUtil {

    private final Properties properties;

    private SessionFactory sessionFactory;
    private StandardServiceRegistry standardServiceRegistry;

    private static final Logger LOGGER = LoggerFactory.getLogger(HibernateUtil.class);

    private static HibernateUtil instance;

    private HibernateUtil() {

        this.properties = ApplicationManager.getPropertiesManager().getProperties();

        try {

            //Persistence.createEntityManagerFactory("info.tsyklop.betsautoplacerbot.persistence.entity");

            StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder();

            Map<String, Object> settings = new HashMap<>();

            settings.put(Environment.DRIVER, properties.getDatasourceH2DriverClassName());
            settings.put(Environment.URL, properties.getDatasourceH2Url());
            settings.put(Environment.USER, properties.getDatasourceH2User());
            settings.put(Environment.PASS, properties.getDatasourceH2Password());
            settings.put(Environment.DIALECT, "org.hibernate.dialect.H2Dialect");

            settings.put(Environment.DATASOURCE, "com.zaxxer.hikari.HikariDataSource");

            settings.put(Environment.SHOW_SQL, properties.getProperty("hibernate.show_sql"));
            settings.put(Environment.FORMAT_SQL, properties.getProperty("hibernate.format_sql"));
            settings.put(Environment.HBM2DDL_AUTO, properties.getProperty("hibernate.hbm2ddl.auto"));
            settings.put(Environment.HBM2DDL_CHARSET_NAME, "utf-8");

            settings.put(Environment.CONNECTION_PROVIDER, properties.getProperty("hibernate.connection.provider_class"));

            settings.putAll(properties.getSubset("hibernate.hikari"));

            this.standardServiceRegistry = registryBuilder.applySettings(settings).build();

            MetadataSources metadataSources = new MetadataSources(this.standardServiceRegistry);

            Reflections reflections = new Reflections("info.tsyklop.desktop.persistence.entity");
            Set<Class<? extends AbstractEntity>> entitiesClasses = reflections.getSubTypesOf(AbstractEntity.class);

            for (Class<? extends AbstractEntity> abstractEntity : entitiesClasses) {
                metadataSources.addAnnotatedClass(abstractEntity);
            }

            this.sessionFactory = metadataSources.getMetadataBuilder().build().getSessionFactoryBuilder().build();

        } catch (Exception e) {
            if (this.standardServiceRegistry != null) {
                StandardServiceRegistryBuilder.destroy(this.standardServiceRegistry);
            }
            throw new HibernateException(e);
        }

    }

    public static HibernateUtil getInstance() {
        HibernateUtil localInstance = instance;
        if (localInstance == null) {
            synchronized (HibernateUtil.class) {
                localInstance = instance;
                if (localInstance == null) {
                    instance = localInstance = new HibernateUtil();
                }
            }
        }
        return localInstance;
    }

    public Session getSession() {
        return sessionFactory.openSession();
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void shutdown() {
        if (this.standardServiceRegistry != null) {
            StandardServiceRegistryBuilder.destroy(this.standardServiceRegistry);
        }
    }

}




Базовый репозиторий для работы с сущностями. От этого репозитория наследуются репозитрии конкретных сущностей.


Код: 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.
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.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
public abstract class BaseRepository<E extends AbstractEntity> implements Repository<E> {

    protected final Class<E> entityClass;

    protected final HibernateUtil hibernateUtil = HibernateUtil.getInstance();

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseRepository.class);

    protected BaseRepository() {
        this.entityClass = (Class<E>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public E save(E entity) throws DataSourceException {
        Session session = null;
        try {

            session = openSession();
            session.beginTransaction();

            session.save(entity);

            commit(session);

        } catch (Exception e) {
            showException(e);
            rollback(session);
            rethrow(e);
        } finally {
            closeSession(session);
        }
        return entity;
    }

    public List<E> findAll() throws DataSourceException {

        Session session = null;

        List<E> list = new ArrayList<>();

        try {

            session = openSession();
            session.beginTransaction();

            list.addAll(session.createQuery("SELECT e FROM " + this.entityClass.getName() + " e", this.entityClass).getResultList());

            commit(session);

        } catch (Exception e) {
            showException(e);
            rollback(session);
            rethrow(e);
        } finally {
            closeSession(session);
        }

        return list;
    }

    //public abstract Optional<E> findById(Long id) throws HibernateException;

    public Optional<E> findById(Long id) throws DataSourceException {

        Session session = null;

        Optional<E> entityOptional = Optional.empty();

        try {

            session = openSession();
            session.beginTransaction();

            entityOptional = Optional.of(session.get(entityClass, id));

            commit(session);

        } catch (Exception e) {
            showException(e);
            rollback(session);
            rethrow(e);
        } finally {
            closeSession(session);
        }
        return entityOptional;
    }

    //public abstract boolean update(E entity) throws HibernateException;

    public boolean update(E entity) throws DataSourceException {
        Session session = null;
        try {

            session = openSession();
            session.beginTransaction();

            session.update(entity);

            commit(session);

            return true;

        } catch (Exception e) {
            showException(e);
            rollback(session);
            rethrow(e);
        } finally {
            closeSession(session);
        }
        return false;
    }

    public boolean delete(E entity) throws DataSourceException {
        Session session = null;
        try {

            session = openSession();
            session.beginTransaction();

            session.delete(entity);

            commit(session);

            return true;

        } catch (Exception e) {
            showException(e);
            rollback(session);
            rethrow(e);
        } finally {
            closeSession(session);
        }
        return false;
    }

    public void clear() throws DataSourceException {

        Session session = null;

        try {

            session = openSession();
            session.beginTransaction();

            session.createQuery("DELETE FROM " + entityClass.getName()).executeUpdate();

            commit(session);

        } catch (Exception e) {
            showException(e);
            rollback(session);
            rethrow(e);
        } finally {
            closeSession(session);
        }

    }

    protected Session openSession() {
        return hibernateUtil.getSession();
    }

    protected void commit(Session session) {
        if (session != null) {
            session.getTransaction().commit();
        }
    }

    protected void rollback(Session session) {
        if (session != null) {
            session.getTransaction().rollback();
        }
    }

    protected void closeSession(Session session) {
        if (session != null) {
            try {
                session.close();
            } catch (Exception ignored) {
            }
        }
    }

    protected void showException(Exception e) {
        LOGGER.error(this.entityClass.getName() + " REPOSITORY ERROR", e);
    }

    protected void rethrow(Exception e) {
        throw new DataSourceException(e);
    }

}




Мне не нравится вот такое:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Session session = null;
try {

     session = openSession();
     session.beginTransaction();

     ...

     commit(session);

} catch (Exception e) {
     showException(e);
     rollback(session);
     rethrow(e);
} finally {
     closeSession(session);
}



Мне это нужно писать в каждом методе. + Не получиться сделать вложенные репозитории. Точнее получиться, но плодить сессии во вложенных репозиториях не очень. (Под вложенными я имею в виду поле класса какого-то репозитория)

К примеру у меня есть такой код (да, знаю он не самый лучший):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
StrategyEntity strategy = StrategyEntity.builder()
             .name(this.nameTextField.getText())
             .build();

this.strategyRepository.save(strategy);

StrategyAmountEntity strategyAmountEntity = StrategyAmountEntity.builder()
            .amount(Double.valueOf(this.amountTextField.getText()))
            .strategy(strategy)
            .build();

this.strategyAmountRepository.save(strategyAmountEntity);

strategy.getStrategyAmounts().add(strategyAmountEntity);

this.strategyRepository.save(strategy);

for (CriteriaEntity rule : this.criteriasListView.getItems()) {
     rule.setStrategy(strategy);
     this.criteriaRepository.save(rule);
     strategy.getCriteries().add(rule);
}



Хибер не дает сохранить StrategyEntity , пока все OneToMany сущности не будут записаны в бд.

Как избежать такого говнокода? может у кого есть варианты как изобразить это получше

P.S. Спринг тут не использую да и он не особо нужен.
...
Рейтинг: 0 / 0
18.12.2019, 08:16
    #39904453
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop,

Лямбды?! :-)
...
Рейтинг: 0 / 0
18.12.2019, 08:21
    #39904454
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
Мне не нравится вот такое:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Session session = null;
try {

     session = openSession();
     session.beginTransaction();

     ...

     commit(session);

} catch (Exception e) {
     showException(e);
     rollback(session);
     rethrow(e);
} finally {
     closeSession(session);
}




Мне это нужно писать в каждом методе.

Убрать в утилитный класс статический. Писал хоть один?
И открывать сессию в конструкторе окна. С окном и закрывать.
...
Рейтинг: 0 / 0
18.12.2019, 08:22
    #39904455
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
mad_nazgul
Tsyklop,

Лямбды?! :-)
микросервисы)
...
Рейтинг: 0 / 0
18.12.2019, 08:25
    #39904456
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop,
- в десктопе транзакции длинные. По 8 часов или на каждое окно
- наследование убери. Нет его
- биндинг ВЕЗДЕ
- если для биндинга нужен плоский список, то можно и без хибера его взять. Это не веб.
...
Рейтинг: 0 / 0
18.12.2019, 09:03
    #39904465
apb12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
не проще прикрутить спринг и сделать норм настройки в апликейшн проперти и использовать jpa repo
чем городить вот это

я же так понимаю ты на кворке сидишь и делаешь различные приложухи-так кто там будет смотреть что у тебя под капотом- делай как быстрей
...
Рейтинг: 0 / 0
18.12.2019, 09:07
    #39904468
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
apb12,
В десктопе на спринг у виска покрутят
...
Рейтинг: 0 / 0
18.12.2019, 13:02
    #39904674
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp

Убрать в утилитный класс статический. Писал хоть один?
И открывать сессию в конструкторе окна. С окном и закрывать.

Утильные классы писал, но не понимаю как это применить тут? Типа статический метод, в котором что? идею Вашу не уловил
...
Рейтинг: 0 / 0
18.12.2019, 13:03
    #39904676
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp
И открывать сессию в конструкторе окна. С окном и закрывать.

Годная идея. Но есть места где обращение к БД идет без окна.
...
Рейтинг: 0 / 0
18.12.2019, 13:04
    #39904679
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
apb12
не проще прикрутить спринг и сделать норм настройки в апликейшн проперти и использовать jpa repo
чем городить вот это

я же так понимаю ты на кворке сидишь и делаешь различные приложухи-так кто там будет смотреть что у тебя под капотом- делай как быстрей


Спринг не юзается с десктопами.
...
Рейтинг: 0 / 0
18.12.2019, 13:05
    #39904681
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp
- в десктопе транзакции длинные. По 8 часов или на каждое окно

Тут да.
PetroNotC Sharp
- наследование убери. Нет его

Какие наследование?
PetroNotC Sharp
- биндинг ВЕЗДЕ
- если для биндинга нужен плоский список, то можно и без хибера его взять. Это не веб.

Биндинг чего и с чем?
...
Рейтинг: 0 / 0
18.12.2019, 13:11
    #39904689
apb12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
apb12
не проще прикрутить спринг и сделать норм настройки в апликейшн проперти и использовать jpa repo
чем городить вот это

я же так понимаю ты на кворке сидишь и делаешь различные приложухи-так кто там будет смотреть что у тебя под капотом- делай как быстрей


Спринг не юзается с десктопами.

а зачем тебе база в десктопе-храни на в файле тогда
...
Рейтинг: 0 / 0
18.12.2019, 13:20
    #39904700
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
В начале 2000х мы разрабатывали классическое десктоп приложение под Sybace Power Builder.
И никакого ORM мы не знали и не использовали. И вы не поверите. Это было - прекрасное приложение.
Oracle-cursors полностью заменяли коллекции. Просто надо было научится с этим работать.
И 128 Мегабайт памяти хватало для десктопного приложения с гридами. Формочками и прочим.
...
Рейтинг: 0 / 0
18.12.2019, 13:20
    #39904702
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
PetroNotC Sharp

Убрать в утилитный класс статический. Писал хоть один?
И открывать сессию в конструкторе окна. С окном и закрывать.

Утильные классы писал, но не понимаю как это применить тут? Типа статический метод, в котором что? идею Вашу не уловил

Будет меньше строк. Например одна - Утилита.старТранзакции.
Тебе это надо?
...
Рейтинг: 0 / 0
18.12.2019, 13:20
    #39904703
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
PetroNotC Sharp
И открывать сессию в конструкторе окна. С окном и закрывать.

Годная идея. Но есть места где обращение к БД идет без окна.
не бывает. Покажи.
...
Рейтинг: 0 / 0
18.12.2019, 13:21
    #39904707
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
Биндинг чего и с чем?
поиск гугл "javaFx +binding
...
Рейтинг: 0 / 0
18.12.2019, 13:23
    #39904708
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp

Годная идея. Но есть места где обращение к БД идет без окна.
не бывает. Покажи.[/quot]
После кнопочке старт, которая нахожится в окне, создается новый поток и там происходят действия и там нужна БД,но окна там нет по факту.
...
Рейтинг: 0 / 0
18.12.2019, 13:26
    #39904711
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
Как избежать такого говнокода?
вопрос по архитектуре. Тогда покажи Модель бд.
...
Рейтинг: 0 / 0
18.12.2019, 13:26
    #39904712
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp

Будет меньше строк. Например одна - Утилита.старТранзакции.
Тебе это надо?

Я вообще хочу что бы старт транзакции, коммит, если все ок, или же роллбэк были в одном месте. В общем как в вебе. Только в вебе прокси, а у меня такой штуки нет. А сейчас мне приходится это писать в каждом методе. + мне нужно делать несколько операций с БД в одной транзакции а не только одну и если в одной будет ошибка - что бы откатились все изменения. Моя модель такого не позволит. Вот и спрашиваю как это сделать.
...
Рейтинг: 0 / 0
18.12.2019, 13:27
    #39904713
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
После кнопочке старт, которая нахожится в окне, создается новый поток и там происходят действия и там нужна БД,но окна там нет по факту.
поток зачем? Подробнее.
...
Рейтинг: 0 / 0
18.12.2019, 13:27
    #39904715
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp
поток зачем? Подробнее.

Автоматизированый робот. Пишет в бд всю инфу которую нашел.
...
Рейтинг: 0 / 0
18.12.2019, 13:29
    #39904716
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
PetroNotC Sharp
вопрос по архитектуре. Тогда покажи Модель бд.

6 сущностей = 6 таблиц. БД описана как сущности в Java коде. Прям модельки у меня нет
...
Рейтинг: 0 / 0
18.12.2019, 13:30
    #39904718
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
Я вообще хочу что бы старт транзакции, коммит, если все ок, или же роллбэк были в одном месте.
тогда как делать коммит и отмена на кнопку Ok/cancel?
Где в веб такое?
...
Рейтинг: 0 / 0
18.12.2019, 13:31
    #39904722
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
Tsyklop
Прям модельки у меня нет
рисуй.
Что за сущность StrategyEntity?
...
Рейтинг: 0 / 0
18.12.2019, 13:31
    #39904723
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 5 и Desktop приложение
mayton
В начале 2000х мы разрабатывали классическое десктоп приложение под Sybace Power Builder.
И никакого ORM мы не знали и не использовали. И вы не поверите. Это было - прекрасное приложение.
Oracle-cursors полностью заменяли коллекции. Просто надо было научится с этим работать.
И 128 Мегабайт памяти хватало для десктопного приложения с гридами. Формочками и прочим.

Неправда, специализированные фреймворки тогда тоже были и Sybace Power Builder с ему подобными, как раз представляли собой фреймворки для быстрого создания приложений работающих с БД, современные фреймворки это скорее полуфабрикат, но все хавают, вот в соседней теме про редактируемый грид с выпадающим списком для поля сказали что это оверхэд, в старых фреймворках такое мастером делалось за минуту, а теперь работу которая делается за час джун не может сделать за неделю))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate 5 и Desktop приложение / 25 сообщений из 46, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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