我目前有一个简单的应用程序,其中我的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
的值为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映射此关系的最佳方法是什么?
非常感谢。
答案 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;
}
但是,您当然需要知道要引用的对象的确切数量