vitya_brodov
@vitya_brodov
Java dev

Как из вложенных объектов в классе сделать одну таблицу?

У меня есть класс, в котором есть другие вложенные объекты.
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BaseEntity {
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name="UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    @JsonIgnore
    private UUID id;
    
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private Curator curator;
    
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private FinAccounts finAccounts;
    
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private Activity activity;
    
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private Address address;
  
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private Partner partner;
    
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private RateType rateType;
    private String retentionSchem;
    
    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id")
    private Tarif tarif;
}

при создании из них таблицу получается несколько таблиц:
6213818d2317e662371674.png
Вопрос: Как можно сделать выше описанного класса сделать одну таблицу в бд?
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Ответ - никак.
Как вы сами сказали, это объекты. А значит, их значения будут хранится в других таблицах. А этот объект при помощи foreign key будет ссылаться на вложенный объект.

Есть правда, следующий вариант (если он вам подойдет):
Если объект может быть встроенным, то вы можете вместо сущности использовать аннотации @Embeddable & @Embedded
https://www.baeldung.com/jpa-embedded-embeddable
Т.е. по факту колонки встраиваемого объекта будут добавлены к основной сущности

P.S. есть еще один вариант реализации вашей задумки. Возможно, что не самый лучший.
В общем, если вы используете БД postgres, то объект можно хранить в формате jsonb.
Из коробки решения нет, но можно подключить доп. либу.
Вот, похожий вопрос:
https://stackoverflow.com/questions/51276703/how-t...

Зависимость:
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.2.2</version>
</dependency>


@Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private List<Child> children;


На мой взгляд, лучше не заморачиваться так. Имхо, правильнее создавать отдельные таблицы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы