【问题标题】:How to persist a collection of Strings in Play Framework 2.3.8?如何在 Play Framework 2.3.8 中持久化字符串集合?
【发布时间】:2015-05-05 17:44:24
【问题描述】:

我有这样的模型:

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 中持久化字符串集合?

【问题讨论】:

    标签: java hibernate playframework ebean


    【解决方案1】:

    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.您的意思是用其他一些ORM(例如Hibernate)替换EBean?我真的很喜欢 EBean 的简单性。对 Hibernate 没有任何经验。 2.我不必使用@ElementCollection,这只是我在黑暗中拍摄的。还有其他方法可以实现我想要的吗?使用 @OneToMany 和附加实体 Language 也许?
    • 1.对,就是这样。我自己不是 Play 开发人员,但我对 Hibernate 和 JPA 有很多了解(Hibernates 实现了 JPA,这是一个 JEE 规范)。 Hibernates 支持注解。 2. 据我了解,@OneToMany 受支持,因此该解决方案将起作用。
    【解决方案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、价格、元

    1, NULL, {"key":"value"}

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 2011-08-17
      • 2018-08-26
      • 1970-01-01
      • 2011-01-20
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多