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

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

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

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

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

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

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

это может вылиться в отдельную огромную задачу
...
Рейтинг: 0 / 0
12.10.2018, 11:07
    #39716547
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
В шарпе MS эти технологии называются CodeFirst, миграция.
Когда база генерируется по коду.
В java более серьезное отношение к базе, разработчикам базы и БД админам.
...
Рейтинг: 0 / 0
12.10.2018, 11:41
    #39716570
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
мы используем для этого liquibase - здесь апдейты делаются через удобные описания в файлах, что отлично подходит для git
...
Рейтинг: 0 / 0
12.10.2018, 12:15
    #39716593
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
Герой днямы используем для этого liquibase - здесь апдейты делаются через удобные описания в файлах, что отлично подходит для git
если не сложно, дай простой пример. Может и мы заюзаем. Мы по простому - скриптами на ЯП субд.
...
Рейтинг: 0 / 0
12.10.2018, 12:29
    #39716599
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
Petro123если не сложно, дай простой пример. Может и мы заюзаем. Мы по простому - скриптами на ЯП субд.Нечего там смотреть: встроенный DSL - наименьший общий делитель поддерживаемых СУБД, т.е. если есть какая-то специфика, то либо DSL становится непортабельным (например типы колонок хреново портируются), либо вообще на DSL сделать нельзя и нужно использовать SQL.
...
Рейтинг: 0 / 0
12.10.2018, 15:14
    #39716736
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
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
12.10.2018, 15:26
    #39716749
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
Герой дня,
понятно.
У нас база одного типа, и скрипт на ЯП базы проще выходит.
...
Рейтинг: 0 / 0
12.10.2018, 15:39
    #39716768
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
Petro123У нас база одного типа, и скрипт на ЯП базы проще выходит.Вам совсем не те фичи, на которые нужно обращать внимание, показывают. Вот, например: loadData позволяет лить тестовые данные в базу (на flyway там будет куча insert), при этом оно может лить и CLOB/BLOB, что на flyway делается исключительно из жава-кода, если скрестить с предусловиями то можно указывать куда лить данные, а куда не лить. Темы с тем, что можно задавать какие скрипты выполнять только один раз, а какие при каждом накате или при изменении тоже весьма полезны.
...
Рейтинг: 0 / 0
12.10.2018, 16:06
    #39716794
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA в DDL
Андрей Панфилов,
ОК.
Именно нам тестовые данные не нужны. Только изменение структуры БД при изменении кода(сущностей).
ТСу может и нужен комбайн.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA в DDL / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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