如何从同一张表映射多个@OneToOne关联

时间:2018-11-25 14:29:40

标签: java database hibernate jpa

我目前有一个简单的应用程序,其中我的Container类的属性映射到数据库列。

今天...

@Entity
class Container {
    @Column
    private BigDecimal propertyA;

    @Column
    private BigDecimal propertyB;
}

我正在尝试扩展设计,以允许将每个逻辑属性的多个值存储在一起。我现在想为每个属性存储5个值,以表示其不确定性(有些可能为空)

在数据库架构级别,可以这样表示。我不相信每个不确定性都需要它自己的id,因为(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的值为propertyApropertyB

像这样的事情会很方便。

@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 :(得分:1)

您所描述的是一个一对多关系,其中每个容器都具有不确定性集合。

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

@Entity
class Uncertainty {
    ...
}

不确定性不需要其他任何东西来映射它。

答案 1 :(得分:0)

您不需要组合键,需要@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;

}

引用(属性A,属性B等)应为:

@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;
}

但是,您当然需要知道要引用的对象的确切数量