我一直在尝试找到一个解决方案,将固定长度数组作为对象的属性存储在同一个数据库表中使用hibernate,而不是使用数组的BLOB。
我目前有一个类看起来像
的ProductionQCSession@Entity
public class ProductionQCSession extends IdEntity {
private Long id;
private Float velocity;
private Float velocityTarget;
private Float[] velocityProfile;
public ProductionQCSession() {
}
@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Override
public Long getId() {
return id;
}
@SuppressWarnings("unused")
public void setId(Long id) {
this.id = id;
}
@Basic
public Float getVelocity() {
return velocity;
}
public void setVelocity(Float velocity) {
this.velocity = velocity;
}
@Basic
public Float[] getVelocityProfile() {
return velocityProfile;
}
public void setVelocityProfile(Float[] velocityProfile) {
this.velocityProfile = velocityProfile;
}
}
理想情况下,我希望数据库结构
id|velocity|VPValue0|VPValue1|VPValue2|VPValue3|...
21| 2.1| 0.1| 0.2| -0.1| 0.3|...
我非常确切地知道,我们在velocityProfile数组中总是有15个项目,并且这些值与对象的属性一样多,因此我认为将它们添加到数据库表模式是有意义的,如果这是可能的。我更喜欢这样,因为只需要进行原始表格打印就可以很容易地获得数据的概述。
当前代码只是将数组数据存储为BLOB。
我看了http://ndpsoftware.com/HibernateMappingCheatSheet.html映射备忘单,但似乎找不到任何好的解决方案。
我只是想做别人不会做的事情?
答案 0 :(得分:0)
基本上,您正在尝试使用多值字段,这不是关系数据库概念。规范化的解决方案会将它们放入子表中,Hibernate允许您直接从父行访问(并将其作为集合返回)。
如果你坚持认为它应该在一个表中,那么你需要创建15个单独的列....并希望将来你不会突然需要16个。
答案 1 :(得分:0)
该解决方案最终使用了使用子表的标准化方法,即使它使数据分析稍微复杂一些。使用了以下代码。
@ElementCollection
@CollectionTable(name ="QCVelocityProfile")
public List<Float> getVelocityProfile() {
return velocityProfile;
}
public void setVelocityProfile(List<Float> velocityProfile) {
this.velocityProfile = velocityProfile;
}