如何在Play Framework 2.3.8中保留一系列字符串?

时间:2015-05-05 17:44:24

标签: java hibernate playframework ebean

我有这样的模特:

import play.db.ebean.Model;
import javax.persistence.*;
import java.util.*;

@Entity
public class Translation extends Model {

    @Id
    public Long id;

    @ElementCollection
    public Set<String> languages = new HashSet<>();
}

编译运行时,数据库演变中没有languages。该数据库是Heroku上的PostgreSQL 9.3.6。

我尝试使用ListArrayList,但这没有帮助。

如何在Play Framework 2.3.8中保留一系列字符串?

2 个答案:

答案 0 :(得分:3)

EBean尚不支持。

如您所知,Play Framework 2.X附带EBean作为其ORM框架。 EBean显然实现了JPA规范的一个子集,似乎缺少一些JPA2特性。

然而,GitHub上有@ElementCollection功能的开放增强请求,该功能似乎已经实施,但尚未发布:

https://github.com/ebean-orm/avaje-ebeanorm/issues/115

所以,无聊的答案是等到Play附带支持注释的ORM实现。另一种选择是使用支持@ElementCollection的JPA提供程序修补(如果可能)Play分发。

答案 1 :(得分:2)

作为方便的解决方案,您可以使用@com.avaje.ebean.annotation.DbJson注释。它以json格式将任何类型的对象存储为数据库中的clob类型。

@Entity
public class Offer extends Model {
    @Id
    public Long id;
    public Double price;

    @DbJson
    public Map<String, String> meta = new HashMap<>();

    public static Find<Long,Offer> find = new Find<Long,Offer>(){};
}

测试代码:

@Test
public void createAndFindOffer() {
    running(fakeApplication(), new Runnable() {
        @Override
        public void run() {
            Offer offer = new Offer();
            Map<String, String> map = new HashMap<>();
            map.put("key", "value");
            offer.meta = map;
            offer.save();

            Offer found = Offer.find.byId(offer.id);
            assertNotNull(found);
            assertEquals(found.meta.get("key"), "value");
        }
    });
}

数据库中的存储实体:

ID,PRICE,META

1,NULL,{“key”:“value”}