Как отобразить несколько ассоциаций @OneToOne из одной таблицы - PullRequest
0 голосов
/ 25 ноября 2018

В настоящее время у меня есть простое приложение, в котором свойства моего класса-контейнера отображаются на столбцы базы данных.

Сегодня ...

@Entity
class Container {
    @Column
    private BigDecimal propertyA;

    @Column
    private BigDecimal propertyB;
}

Я пытаюсь расширить свой дизайн, чтобы разрешить несколькозначения должны храниться вместе для каждого логического свойства.Теперь я хотел бы сохранить 5 значений для каждого свойства, чтобы представить их неопределенность (некоторые могут быть нулевыми)

На уровне схемы базы данных это можно представить так.Я не верю, что каждая неопределенность требует своего собственного идентификатора, поскольку комбинация (container_id, data_field) уникальна.

CREATE TABLE container (
    id INT PRIMARY KEY,
    ...
);

CREATE TABLE uncertainty (
    container_id bigint not null,
    data_field varchar(100) not null,
    maximum decimal null,
    upside decimal null,
    reference decimal null,
    downside decimal null,
    minimum decimal null,
    primary key (container_id, data_field),
    constraint fk_container_id foreign key (container_id) references container (id),
);

В таблице uncertainty будет одна строка для каждого свойства в Container, котороетребуется эта функциональность.

В приведенном выше примере в uncertainty было бы две строки со значениями data_field, равными propertyA и propertyB.

Что-то подобное было бы удобно ..

@Entity
class Container {

    // How do I map multiple @OneToOne relationships to the uncertainty table based on e.g. the value of data_field = 'propertyA' or data_field = 'propertyB'

    private Uncertainty propertyA;
    private Uncertainty propertyB;
}

@Entity
class Uncertainty {

    // Do I need fields here to represent the composite primary key (containerId, data_field)?

    @Column
    private BigDecimal maximum;

    @Column
    private BigDecimal upside;

    @Column
    private BigDecimal reference;

    @Column
    private BigDecimal downside;

    @Column
    private BigDecimal minimum;
}

Как лучше всего сопоставить эти отношения с JPA / Hibernate?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

вам не нужен составной ключ, вам нужен @ Id

@Entity
class Uncertainty {

// Do I need fields here to represent the composite primary key (containerId, data_field)?

@Id
private int id;

@Column
private BigDecimal maximum;

@Column
private BigDecimal upside;

@Column
private BigDecimal reference;

@Column
private BigDecimal downside;

@Column
private BigDecimal minimum;

}

И ссылки (propertyA, propertyB и т. Д.) Должны быть:

@Entity
class Container {

// How do I map multiple @OneToOne relationships to the uncertainty table based on e.g. the value of data_field = 'propertyA' or data_field = 'propertyB'

    @OneToOne
    private Uncertainty propertyA;
    @OneToOne
    private Uncertainty propertyB;
}

однако, конечно, вам нужно знать точное количество объектов, на которые вы хотите сослаться

0 голосов
/ 25 ноября 2018

То, что вы описали, является отношением OneToMany, где каждый Контейнер имеет коллекцию Неопределенности.

@Entity
class Container {
    @JoinColumn(name = "container_id")
    private Collection<Uncertainty> properties;
    ...
}

@Entity
class Uncertainty {
    ...
}

Ничего дополнительного не требуется в Неопределенности, чтобы отобразить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...