json - 使用JEST将ElasticSearch结果映射到JPA实体

标签 json jakarta-ee jpa elasticsearch eclipselink

我在应用程序中实现搜索功能,在其中搜索数据库中的记录。我为此使用ElasticSearch,我知道我必须保持数据库和索引同步。我将在应用程序层进行处理。

我的问题更多是关于从我的J2EE 7应用程序查询ElasticSearch。我可以从查询中获取JsonObject或JsonArray,然后使用Gson库及其JsonObject和JsonArray类“手动解析”它,但效率不高。

根据我的阅读,使用GSON解析的最佳实践是拥有一个与您的Json对象具有相同结构的POJO。我可以这样做,但是此POJO与我的JPA实体非常相似,因此我将在两个地方拥有相同的信息,这将使维护变得更加困难。我一直无法使它无缝运行,但是我想尝试另一种方法。

所以我的问题是,是否可以将json对象映射到JPA实体,更重要的是,这是一种好习惯吗?

这是我的JSON(变量名称可以更改,我知道它们现在不匹配):

        {
           "vendorEcommerce": 1,
           "Categories": {
              "Sub": [
                 4,
                 8,
                 5
              ],
              "Main": [
                 1,
                 2
              ]
           },
           "Countries": 1,
           "vendorFeatured": 1,
           "vendorWebsite": "www.johndoesserviceprovider.com",
           "vendorEmail": "johndoe@gmail.com",
           "vendorCreated": "2015-02-25T17:00:13.000Z",
           "vendorName": "John Doe's Service Provider",
           "vendorLocation": 1,
           "vendorRating": 1,
           "States": [
              1,
              2
           ],
           "vendorUpdated": "2015-02-25T17:00:13.000Z",
           "vendorPhone": "+11235551234",
           "vendorDescription": "This is John Doe's Service Provider Description",
           "vendorPromotion": "Oh yeah",
           "vendorPrice": 3
        }

这是我的JPA实体(忽略了相关信息):
public class VendorEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    private Integer vendorId;
    private Date vendorCreated;
    private Date vendorUpdated;
    private String vendorName;
    private String vendorWebsite;
    private String vendorPhone;
    private String vendorEmail;
    private String vendorDescription;
    private Boolean vendorEcommerce;
    private Integer vendorRating;
    private Integer vendorPrice;
    private String vendorPromotion;
    private Boolean vendorFeatured;
    private LocationEntity location;
    private List<ServiceCategoryEntity> categories;
    private List<VendorCoverageEntity> coverages;
}

最佳答案

您可以将Spring Data Elasticsearch与JPA一起使用。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ElasticsearchCrudRepository.class))
@EnableElasticsearchRepositories(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ElasticsearchCrudRepository.class))
public class DataConfiguration {
    ...
}

实体示例:
@Entity
@Table(name="learn_author")
@Document(indexName = "blogging", type = "author", shards = 1, replicas = 0)
public class Author implements Serializable {

    @org.springframework.data.annotation.Id
    @Id
    @GeneratedValue(strategy= GenerationType.SEQUENCE)
    @Column(name="id")
    private Long id;

    @Column(name="username")
    private String username;

    @Field(type = FieldType.String,
        searchAnalyzer = "standard",
        indexAnalyzer = "standard",
        store = true)
    @Column(name="fullname")
    private String fullname;

    ...

}

click here的完整示例

关于json - 使用JEST将ElasticSearch结果映射到JPA实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28878394/

相关文章:

java - 运行时异常是@ApplicationException(rollback=false) 但事务最终回滚

java - 过滤存储库或服务中的对象?

Java JPA 非法参数异常 - 名称 : xyz not found 的 NamedQuery

hibernate - CriteriaBuilder 谓词 isMember 仅使用实体 ID

java - 使用 jpa 从 postgres 读取 byte[] 时长度几乎翻倍

android - JSON 解析成 ListView

java - 将请求的查询字符串解析为 JSON

android - getApplicationContext()' 在非 Activity 中使用 volley 的空对象引用

java - 使用Gson以自定义方式将Date对象序列化为JSON(注释)

java - 使用 TYPE 通过 Inheritance.table_per_class 策略仅选择特定类