powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA в DDL
21 сообщений из 21, страница 1 из 1
JPA в DDL
    #39714513
NTDim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Проект, доступ к бд обеспечивается с помощью spring data jpa + eclipselink.
В процессе разработки меняются entity несколькими разработчика независимо друг от друга.

Вопрос, как оптимально сгенерировать sql скрипты обновления БД на основе новых сущностей в java ?
Желательно с примерами...
...
Рейтинг: 0 / 0
JPA в DDL
    #39714536
.sergey.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я почему то думал всегда что процесс идет в обратную сторону... Сначала меняем базу, пишем под это скрипты, а потом меняем entity
...
Рейтинг: 0 / 0
JPA в DDL
    #39714576
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NTDim,

Для миграций используется Flyway и liquibase.
...
Рейтинг: 0 / 0
JPA в DDL
    #39714605
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NTDimПривет всем!
Проект, доступ к бд обеспечивается с помощью spring data jpa + eclipselink.
В процессе разработки меняются entity несколькими разработчика независимо друг от друга.
Вопрос, как оптимально сгенерировать sql скрипты обновления БД на основе новых сущностей в java ?
Желательно с примерами...

От джавы мапить таблицы в бд можно, конечно, но... все же лучше, особенно, когда разрабов несколько, джаве давать только читать поля (ясное дело и менять данные), но не создавать новые. В конце концов, если есть кто-то, кто отвечает за задачи по БД будет очень удивлен, почему у него когда-нибудь перестанет что-то работать, например процедуры и другие его штуки )
Но это не ответ на ваш вопрос, просто информация к размышлению
...
Рейтинг: 0 / 0
JPA в DDL
    #39714610
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack5NTDim,

Для миграций используется Flyway и liquibase.
есть вроде еще плагины которые сами просто рисуют базу под новую схему. правда, дропают все данные там. ну и пофиг для девелопмента самое то.
...
Рейтинг: 0 / 0
JPA в DDL
    #39714662
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
andreykaTcossack5NTDim,

Для миграций используется Flyway и liquibase.
есть вроде еще плагины которые сами просто рисуют базу под новую схему. правда, дропают все данные там. ну и пофиг для девелопмента самое то.Зачем какие-то плагины? Функция генерация DDL включена во все основные реализации (Hibernate, EclipseLink). Например, вот . Напоминаю, данную функцию допустимо использовать ТОЛЬКО на начальном этапе разработки, когда допустимо уничтожение всех тестовых данных. Хотя на выходе получается, откровенно говоря, так себе. Перед релизом надо переходить на liquibase или ему подобные инструменты верисонирования.

P.S. Мы делали некоторые проекты с авто генерацией DDL, но в итоге перешли на liquibase с самого начала проекта. Т.к. в начале пути схема меняется часто, то позволяем себе скрипты миграции поправлять, удаляя все объекты в БД вручную.
...
Рейтинг: 0 / 0
JPA в DDL
    #39714871
NTDim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А flyway и liquibase умеют из jpa строить разницу с БД в sql скриптах ?
Они же вроде умеют строить разницу только между двумя БД ...
...
Рейтинг: 0 / 0
JPA в DDL
    #39714896
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде можно доктриной накатить ddl а потом flyway`ем построить на основе диффа
...
Рейтинг: 0 / 0
JPA в DDL
    #39714897
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*не доктриной, а хибером/клипсом
...
Рейтинг: 0 / 0
JPA в DDL
    #39715169
NTDim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett, прошу прощения, а можно более детально и если возможно с примером ?
...
Рейтинг: 0 / 0
JPA в DDL
    #39715358
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NTDimHett, прошу прощения, а можно более детально и если возможно с примером ?
Давно уже flyway не касался. Сейчас посмотрел, он не умеет генерировать sql. Видимо я что-то путаю, может в другом инструменте это делал.
...
Рейтинг: 0 / 0
JPA в DDL
    #39716427
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если с каждой версией создавать новую базу
данные потом переносить с учетом изменений
в конструкции?
...
Рейтинг: 0 / 0
JPA в DDL
    #39716454
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov,

это может вылиться в отдельную огромную задачу
...
Рейтинг: 0 / 0
JPA в DDL
    #39716547
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В шарпе MS эти технологии называются CodeFirst, миграция.
Когда база генерируется по коду.
В java более серьезное отношение к базе, разработчикам базы и БД админам.
...
Рейтинг: 0 / 0
JPA в DDL
    #39716570
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мы используем для этого liquibase - здесь апдейты делаются через удобные описания в файлах, что отлично подходит для git
...
Рейтинг: 0 / 0
JPA в DDL
    #39716593
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой днямы используем для этого liquibase - здесь апдейты делаются через удобные описания в файлах, что отлично подходит для git
если не сложно, дай простой пример. Может и мы заюзаем. Мы по простому - скриптами на ЯП субд.
...
Рейтинг: 0 / 0
JPA в DDL
    #39716599
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123если не сложно, дай простой пример. Может и мы заюзаем. Мы по простому - скриптами на ЯП субд.Нечего там смотреть: встроенный DSL - наименьший общий делитель поддерживаемых СУБД, т.е. если есть какая-то специфика, то либо DSL становится непортабельным (например типы колонок хреново портируются), либо вообще на DSL сделать нельзя и нужно использовать SQL.
...
Рейтинг: 0 / 0
JPA в DDL
    #39716736
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Герой днямы используем для этого liquibase - здесь апдейты делаются через удобные описания в файлах, что отлично подходит для git
если не сложно, дай простой пример. Может и мы заюзаем. Мы по простому - скриптами на ЯП субд.

тут доступно и легко написано:

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

Создаете файлы, пишите их друг за дружкой в файл для тестового или продуктового XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">

    <property name="idField" value="ID"/>

    <property name="autoIncrement" value="true" dbms="mysql, hsqldb"/>
    <property name="autoIncrement" value="false" dbms="oracle"/>

    <!-- список файлов с изменениями схемы БД -->
    <include file="changelog/20160530-01-generate_id_function.xml" relativeToChangelogFile="true"/>
    <include file="changelog/20151229-01-synonyms_table.xml" relativeToChangelogFile="true"/>
    <include file="changelog/20162902-01-properties.xml" relativeToChangelogFile="true"/>
    <include file="changelog/20160309-01-dictionary_table.xml" relativeToChangelogFile="true"/>

</databaseChangeLog>



пример одного из файлов:

Код: 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.
<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">

    <property name="facetTable" value="FACET"/>
    <property name="facetValueTable" value="FACET_VALUE"/>
    <property name="value2FacetValueTable" value="VALUE_TO_FACET_VALUE"/>
    <property name="categoryId2FacetValueTable" value="CATEGORY_ID_TO_FACET_VALUE"/>
    <property name="salesTable" value="SALES"/>

    <changeSet author="author1" id="20160120">

        <comment>Таблица фасетов (GROUP FILTER)</comment>
        <createTable tableName="${facetTable}">
            <column name="ID" type="BIGINT" autoIncrement="${autoIncrement}">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="NAME" type="VARCHAR(255)">
                <constraints nullable="false"/>
            </column>
            <column name="SORT_VALUE" type="INT">
                <constraints nullable="false"/>
            </column>
            <column name="SORT_TYPE" type="VARCHAR(255)">
                <constraints nullable="true"/>
            </column>
            <column name="ACTIVE" type="BOOLEAN" defaultValueBoolean="true" valueBoolean="true">
                <constraints nullable="false"/>
            </column>
            <column name="CATEGORY_ID" type="BIGINT">
                <constraints nullable="true"/>
            </column>
            <column name="VISIBLE" type="BOOLEAN">
                <constraints nullable="true"/>
            </column>
            <column name="COLLAPSED" type="BOOLEAN">
                <constraints nullable="true"/>
            </column>
            <column name="FIRST_ONLY" type="BOOLEAN">
                <constraints nullable="true"/>
            </column>
            <column name="FACET_TYPE" type="VARCHAR(255)">
                <constraints nullable="true"/>
            </column>
            <column name="MULTI_SELECTABLE" type="BOOLEAN">
                <constraints nullable="true"/>
            </column>
            <column name="ATTRIBUTE_ID" type="BIGINT">
                <constraints nullable="true"/>
            </column>
        </createTable>

        <comment>Таблица значений фасетов (FILTER)</comment>
        <createTable tableName="${facetValueTable}">
            <column name="ID" type="BIGINT" autoIncrement="${autoIncrement}">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="CODE" type="VARCHAR(1000)">
                <constraints nullable="false"/>
            </column>
            <column name="NAME" type="VARCHAR(1000)">
                <constraints nullable="false"/>
            </column>
            <column name="ACTIVE" type="BOOLEAN" defaultValueBoolean="false">
                <constraints nullable="false"/>
            </column>
            <column name="SORT_VALUE" type="INT" defaultValueNumeric="0">
                <constraints nullable="false"/>
            </column>
            <column name="FACET_ID" type="BIGINT">
                <constraints nullable="false"/>
            </column>
            <column name="ATTRIBUTE_ID" type="BIGINT">
                <constraints nullable="true"/>
            </column>
            <column name="FACET_VALUE_TYPE" type="VARCHAR(255)">
                <constraints nullable="false"/>
            </column>
            <column name="MIN_VALUE" type="DOUBLE"/>
            <column name="MAX_VALUE" type="DOUBLE"/>
            <column name="IS_SEO" type="BIT">
                <constraints nullable="true"/>
            </column>
            <column name="SEO_URL" type="VARCHAR(255)">
                <constraints nullable="true"/>
            </column>
            <column name="SEO_SORT_VALUE" type="INT" defaultValueNumeric="0">
                <constraints nullable="true"/>
            </column>
        </createTable>

        <createTable tableName="${categoryId2FacetValueTable}">
            <column name="ID" type="BIGINT" autoIncrement="${autoIncrement}">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="FACET_VALUE_ID" type="BIGINT">
                <constraints foreignKeyName="FK_CATEGORY_ID_FACET_VALUE_ID"
                             references="${facetValueTable}(ID)"
                             deleteCascade="true"
                             nullable="false"/>
            </column>
            <column name="CATEGORY_ID" type="BIGINT">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <createTable tableName="${value2FacetValueTable}">
            <column name="ID" type="BIGINT" autoIncrement="${autoIncrement}">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="FACET_VALUE_ID" type="BIGINT">
                <constraints foreignKeyName="FK_VALUE_FACET_VALUE_ID"
                             references="${facetValueTable}(ID)"
                             deleteCascade="true"
                             nullable="false"/>
            </column>
            <column name="VALUE" type="VARCHAR(1000)">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <comment>Таблица акций</comment>
        <createTable tableName="${salesTable}">
            <column name="ID" type="BIGINT" autoIncrement="${autoIncrement}">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="BITRIX_ID" type="BIGINT">
                <constraints nullable="false"/>
            </column>
            <column name="FACET_VALUE_CODE" type="VARCHAR(25)">
                <constraints nullable="false"/>
            </column>
            <column name="START_DATE" type="DATETIME">
                <constraints nullable="true"/>
            </column>
            <column name="END_DATE" type="DATETIME">
                <constraints nullable="true"/>
            </column>
        </createTable>
    </changeSet>

    <changeSet id="20160602" author="author2">
        <createIndex tableName="${facetTable}" indexName="IDX_SEARCH_FACETS">
            <column name="CATEGORY_ID" type="BIGINT"/>
            <column name="ACTIVE" type="BOOLEAN"/>
            <!--<column name="VISIBLE" type="BOOLEAN"/>-->
            <column name="SORT_TYPE" type="VARCHAR(255)"/>
        </createIndex>
    </changeSet>

    <changeSet id="20170909" author="author3">
        <createIndex tableName="${facetValueTable}" indexName="IDX_FACET_VALUE_FACET_ID">
            <column name="FACET_ID" type="BIGINT"/>
        </createIndex>
    </changeSet>
</databaseChangeLog>
...
Рейтинг: 0 / 0
JPA в DDL
    #39716749
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дня,
понятно.
У нас база одного типа, и скрипт на ЯП базы проще выходит.
...
Рейтинг: 0 / 0
JPA в DDL
    #39716768
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123У нас база одного типа, и скрипт на ЯП базы проще выходит.Вам совсем не те фичи, на которые нужно обращать внимание, показывают. Вот, например: loadData позволяет лить тестовые данные в базу (на flyway там будет куча insert), при этом оно может лить и CLOB/BLOB, что на flyway делается исключительно из жава-кода, если скрестить с предусловиями то можно указывать куда лить данные, а куда не лить. Темы с тем, что можно задавать какие скрипты выполнять только один раз, а какие при каждом накате или при изменении тоже весьма полезны.
...
Рейтинг: 0 / 0
JPA в DDL
    #39716794
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,
ОК.
Именно нам тестовые данные не нужны. Только изменение структуры БД при изменении кода(сущностей).
ТСу может и нужен комбайн.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA в DDL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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