Hibernate:在一个数据库表行中存储一个固定长度的数组

时间:2015-04-20 14:02:22

标签: mysql arrays hibernate

我一直在尝试找到一个解决方案,将固定长度数组作为对象的属性存储在同一个数据库表中使用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映射备忘单,但似乎找不到任何好的解决方案。

我只是想做别人不会做的事情?

2 个答案:

答案 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;
        }