无法使用JPA持久化hashmap

时间:2011-10-05 08:47:46

标签: java hibernate collections playframework jpa-2.0

我正在努力尝试使用下面的代码将地图持久保存到SQLserver并继续收到以下错误:

*由以下原因引起:com.microsoft.sqlserver.jdbc.SQLServerException:无效的对象名称“OnlineReport_availabilities”。 *

我使用Play框架JPA已经设法在使用类似代码之前保留了Maps。我尝试在数据库中手动创建表以查看名称是否有任何问题,但一切似乎都没问题。

我在这里做一些非传统或不正确的事情?


   @Entity
    public class OnlineReport extends Model {

    @Temporal(TemporalType.DATE)
    public Date date;

    @ElementCollection
    public Map<Date, Double> availabilities;

    public OnlineReport(){
        this.date = new Date();
        this.availabilities = new HashMap<Date, Double>();         
    }

    public void addAvailability(double availability){
        TreeSet<Date> set = new TreeSet(availabilities.entrySet());

        Date lastEntry = null;
        if(!set.isEmpty())
            lastEntry = set.last();

        Date now = new Date();
        if(lastEntry != null){
            //Add availibility every 10mn
            if(DateUtil.getMinutesBetween(lastEntry, now) >= 10){
                availabilities.put(now, availability);
                save();
            }
        } else {
            availabilities.put(now, availability);
            save();
        }
    }
}


更新

在debugSQL中运行JPA我注意到以下错误:

错误〜不成功:创建表OnlineReport_availabilities(OnlineReport_id数字(19,0)不为空,可用性为double precision null,availability_KEY datetime为null,主键(OnlineReport_id,availabilitysilities_KEY))

错误〜无法在表'OnlineReport_availabilities'中的可空列上定义PRIMARY KEY约束。

我的印象是我缺少一些'可用性'的注释定义。

1 个答案:

答案 0 :(得分:1)

可能您没有这样的表,或者无法通过连接使用。对象(表,字段等)在db?

中是否区分大小写

因此,在您更新后我们知道您没有桌子的原因。看起来它无法为作为密钥一部分的列创建非null -constraint。对于SQL Server,Dialect失败,因为您的映射很少,但是正确。您可以尝试通过添加以下注释来强制它:

@MapKeyColumn(columnDefinition = "datetime not null")

当然,如果每毫秒可能存在多个条目,则将日期时间作为密钥的一部分会产生问题。