How to persist a collection of Strings in Play Framework 2.3.8?

时光总嘲笑我的痴心妄想 提交于 2019-12-11 11:41:25

问题


I have such model:

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<>();
}

When I compile and run, there are no languages in the database evolution. The database is PostgreSQL 9.3.6 on Heroku.

I tried with List and ArrayList, but this didn't help.

How to persist a collection of Strings in Play Framework 2.3.8?


回答1:


It is not yet supported by EBean.

As you know, Play Framework 2.X ships with EBean as its ORM framework. EBean apparently implements a subset of the JPA specification, and seems to be missing some of the JPA2 features.

There is however an open enhancement request on GitHub for the @ElementCollection feature, which also seems to already been implemented, but not released:

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

So, the boring answer is to wait until Play ships with an ORM implementation which supports the annotation. The other option is to patch (if possible) your Play distribution with a JPA provider that supports @ElementCollection.




回答2:


as handy solution you can use @com.avaje.ebean.annotation.DbJson annotion. It stores any kind of object in a json format as clob type in the database.

@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>(){};
}

The test code:

@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");
        }
    });
}

Stored entity in database:

ID, PRICE,META

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



来源:https://stackoverflow.com/questions/30059787/how-to-persist-a-collection-of-strings-in-play-framework-2-3-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!