Play Framework:使用JPA存储Map,键值的解决方案

Ali*_*can 13 jpa java-ee playframework playframework-2.0

我在Play中使用JPA如何存储HashMap将近一周.存储所有其他属性,只有HashMap具有零元素(为空).

public class ImageModel extends Model {

 @Id
 private String id;
 private String url;

 @ElementCollection(targetClass = java.lang.String.class)
 @MapKeyClass(java.lang.String.class)
 private Map<String,String> tags = new HashMap<>();

 // the method for adding keys and values to the HashMap
 public void add(String key, String value){
    tags.put(key,value);
    this.save();
}

}
Run Code Online (Sandbox Code Playgroud)

我还尝试用以下内容进行注释:

@ElementCollection(fetch=FetchType.LAZY)
Run Code Online (Sandbox Code Playgroud)

所以,我现在唯一的猜测是我没有配置好Play.(我必须说我正在使用Play2并且没有配置任何东西,除了在数据库设置前删除"#"(注释标记)).

On Play文档说:" Play 2.0中没有内置的JPA实现 ".可能是这样吗?

更新:我做了一些研究并说可能是因为我正在使用Play-H2的默认数据库.我尝试使用MySQL - 视频如何做到这一点,但它再次只保存了id和url.我查看了MySQL数据库和表,该类的名称只有2个属性(id和url),没有我的HashMap的痕迹.

Update2:添加了一个打印屏幕 - 带有数据库查询.

Update3:Play中的示例"computer-database-jpa"工作正常,因此JPA应该没问题,但该示例没有使用Map(HashMap).我甚至用EclipseLink改变了hibernate,但仍然没有工作.:(虽然,所有基本类型属性都在数据库中)

Ray*_*d26 4

以下是我如何使用您的模型实现 HashMap。

@Entity
public class ImageModel extends Model {
    //All your fields, etc.

    @ManyToMany(mappedBy = "imagesWithTag")
    @MapKey(name = "name")
    public Map<String,Tag> tags = new HashMap<String,Tag>();
}

@Entity
public class Tag extends Model {
    // All your fields, etc.

    public String name;
    public String value;

    @ManyToMany
    public List<ImageModel> imagesWithTag = new ArrayList<ImageModel>();
}
Run Code Online (Sandbox Code Playgroud)

我决定采纳 Eric 的建议,为标签创建一个完整的模型,以便轻松进行查询,但有时能够使用地图的功能会有很大帮助。这也适用于 EnumMap。

public void addTag(String tagName, String value) {
    Tag tag = Tag.finderTag.where().eq("name", tagName).eq("value", value).findUnique();
    if(tag == null) {
        tag = Tag.newTag(tagName, value);
    }
    this.tags.put(tag.name, tag);
    this.saveManyToManyAssociations("tags");
}

public static List<ImageModel> getImagesWithTag(String tagName, String tagValue) {

    Tag tag = finderTag.where().eq("name", tagName).eq("value", tagValue).findUnique();

    List<ImageModel> images = new ArrayList<ImageModel>();
    for(ImageModel model : tag.imagesWithTag) {
        images.add(model);
    }
    return images;
}
Run Code Online (Sandbox Code Playgroud)

我几乎没有看到任何有关在 Play 框架模型中使用地图的信息,因此我决定创建一个小型示例项目 (Play 2.1.1) 来尝试并进一步演示地图的使用。

https://github.com/Raymond26/play-framework-demos/tree/master/PlayMap