Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA и исторические таблицы, сменить @ID наследуемой Entity / 8 сообщений из 8, страница 1 из 1
14.06.2020, 09:56
    #39968937
hck1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
подскажите как в JPA поверх spring boot 2 исторические таблицы следует оформлять. у основной таблицы есть ID, у исторической ID становится обычным not null полем, HIST_ID становится primary key.

Код: 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.
@Entity
@Builder
@Data
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@Table(name="products")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Product {
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Id
        private @NonNull Long id;
        private @NonNull String name;
...
}


@Entity
@Data
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@Table(name="hist_products")
public class ProductHistory extends Product {
        @Column(name = "hist_id")
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Id
        private @NonNull Long histId;

        @Column(name = "hist_inserted")
        private String histInserted;

        private @NonNull Long id;




Caused by: java.lang.ClassCastException: class org.hibernate.mapping.UnionSubclass cannot be cast to class org.hibernate.mapping.RootClass (org.hibernate.mapping.UnionSubclass and org.hibernate.mapping.RootClass are in unnamed module of loader 'app')


тот же exception если из hist таблицы убрать id, как я понимаю тогда 2 primary ключа выходит.
...
Рейтинг: 0 / 0
14.06.2020, 11:37
    #39968956
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
hck1,
Не делают так историю.
*наследование при рсубд не рекомендуется без обоснования
Вам в ветку Разработка БД чтобы продумать правильные таблицы истории.
Правильную Модель.
А jpa работает только по правильной.
Еще делят на OLAP/OLTP и денормализуют таблицы истории (держат отдельно)
Имхо
...
Рейтинг: 0 / 0
14.06.2020, 15:44
    #39969009
hck1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
PetroNotC Sharp
hck1,
Не делают так историю.

Абсолютное большинство именно так делают. Slowly changing dimension
...
Рейтинг: 0 / 0
14.06.2020, 15:53
    #39969011
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
По идее это можно решить, если аннотировать не поле, а геттер. Но это проверить надо, на 100% не гарантирую. Плюс в хибернейте есть встроенный аудит - envers - его еще можно чекнуть
...
Рейтинг: 0 / 0
15.06.2020, 06:37
    #39969178
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
hck1,

Выкинуть Lombok, аннотации делать над гетером.

Вместо lombok можно взять java 14 :-)
...
Рейтинг: 0 / 0
15.06.2020, 08:43
    #39969194
hck1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
что-то не получилось с анотацией над геттером. @Data заменил на @Setter, сгенерировал геттеры, над нужным геттером поставил @Id, но получил тот же exception.
вопрос, а что я должен был c id сделать в ProductHistory ? я попробовал просто убрать, попробовал убрать поле и переопределить getId(), что бы избавится от наследуемой анотации @Id

Код: java
1.
2.
3.
4.
        @Override
        public Long getId() {
                return super.getId();
        }
...
Рейтинг: 0 / 0
15.06.2020, 11:05
    #39969257
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
В моей голове это было как-то так:
Базовый класс:
Код: java
1.
2.
3.
4.
5.
    @Id
    @Column(name="id")
    public Long getId() {
        return id;
    }


История:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Id
    @Column(name="histId")
    public Long getId() {
        return histId;
    }

    @Column(name="id")
    public Long getEntityId() {
        return id;
    }


Но опять же не уверен, будет ли точно так работать
...
Рейтинг: 0 / 0
15.06.2020, 13:21
    #39969300
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и исторические таблицы, сменить @ID наследуемой Entity
hck1
PetroNotC Sharp
hck1,
Не делают так историю.

Абсолютное большинство именно так делают. Slowly changing dimension

Угу.
У нас был тип 2 SCD и это быт такой геморрой с меняющимся ID, FK что врагу не пожелаю.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA и исторические таблицы, сменить @ID наследуемой Entity / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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