我有这样的模特:
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。
我尝试使用List
和ArrayList
,但这没有帮助。
如何在Play Framework 2.3.8中保留一系列字符串?
答案 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”}