powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate 5 и Desktop приложение
25 сообщений из 46, страница 1 из 2
Hibernate 5 и Desktop приложение
    #39904415
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 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
Hibernate 5 и Desktop приложение
    #39904453
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

Лямбды?! :-)
...
Рейтинг: 0 / 0
Hibernate 5 и Desktop приложение
    #39904454
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Hibernate 5 и Desktop приложение
    #39904455
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul
Tsyklop,

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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