Java JPA数组映射

Java JPA数组映射,java,hibernate,jpa,playframework,Java,Hibernate,Jpa,Playframework,如何在JPA中映射一个双精度数组。 我有以下代码失败,因为hibernate无法初始化数组 @Entity public class YearlyTarget extends GenericModel { @Id public Integer year; @ElementCollection public Double[] values; public YearlyTarget(int year) { this.year = yea

如何在JPA中映射一个双精度数组。 我有以下代码失败,因为hibernate无法初始化数组

@Entity
public class YearlyTarget extends GenericModel {

    @Id
    public Integer  year;

    @ElementCollection
    public Double[] values;

    public YearlyTarget(int year) {
        this.year = year;
        this.values = new Double[12];
    }
}

使用对象类型,如ArrayList。范例

@ElementCollection
public ArrayList<Double> values;

public YearlyTarget(int year) {
    this.year = year;
    this.values = new ArrayList<Double>(12);
}
@ElementCollection
公共ArrayList价值观;
公共年度目标(国际年){
今年=年;
this.values=新的ArrayList(12);
}

JPA不要求能够将数组持久化到单独的表中;显然JDO是这样做的,但是您选择了不使用它。因此,您需要将它们存储为@Lob,或者将java类型更改为列表。

您不需要指定支持映射的所需数据库结构
@ElementCollection
依赖于检索集合时联接的表

例如,在Postgresql数据库中,您可以在可以映射的列中存储一个简单数组。您需要包括以下内容:


目前该库只支持int和string,但添加新类型是一项相当简单的任务。

你的意思是数组不能直接映射到jpa,需要使用集合吗?@emt14普通数组如果有一个频繁更改的值集合,那么使用它将是一件非常麻烦的事情。解决了同样的问题,得到了同样的结果:使用集合。数组也是固定长度数据类型的最佳存储选项。与集合相比没有开销。使用集合似乎是解决jpa不会持久化数组这一事实的一种方法。@emt14我怀疑jpa实现不能像列表或其他集合那样轻松地使用代理数组。@emt14 ArrayList使用数组作为底层存储。使用ArrayList而不是数组时,不会有太大的开销。是的,调整大小会发生,但通常不会对性能产生巨大影响(当然取决于上下文)。另请参见:一般认为,使用列表接口抽象的可读性和可测试性的好处超过了其他关注点。
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
</dependency>
@Entity
@Table(name = "products")
@TypeDefs(@TypeDef(name = "string-array", typeClass = StringArrayType.class))
public class Product {

    @Type(type = "string-array" )
    @Column(name = "colours")
    private String[] colours;

}