Hibernate搜索,实体和SQL VIEW

Sha*_*man 5 sql lucene hibernate view hibernate-search

我有一个表,用于维护tbl_products使用PostgreSQL 9.1 销售的产品行.还有其他几个表维护项目,评论等的评级.我们在Seam应用程序中使用JPA/Hibernate进行ORM,并正确连接相应的实体.为了更好地列出这些项目,我创建了一个SQL VIEW(v_product_summary),它汇总了一些基本的产品数据(名称,描述,价格等)和其他表格中的数据(评论数量,平均评级)等).这提供了一个非常简洁的数据视图,我创建了一个相应的JPA实体对象,它提供对视图数据的只读访问.

关于在Productobject(tbl_products)或ProductSummary(v_product_summary)对象上运行JPQL查询,一切正常.但是,我们希望使用Hibernate Search和Lucene提供更丰富的搜索体验.但是,我们遇到的问题是如何ProductSummary使用Hibernate Search 查询对象?它们在创作时没有编入索引,因为它们从未真正"创造"过.它们是作为只读对象获得的v_product_summary VIEW.索引条目仅在Product持久保存到数据库时创建,而不是ProductSummary因为它永远不会持久化.

我们的想法是我们应该能够:

  1. 将我们的Product对象保留在数据库中
  2. ProductSummary使用产品ID 立即查询相应的对象
  3. 手动更新ProductSummary对象的Hibernate Search索引

这可能吗?这甚至是个好主意吗?我可以看到,由于我们ProductSummary每次持久保存新产品时都会对对象执行查询,因此会产生性能影响.但是,产品没有以高容量添加到数据库中,所以我认为这不是一个大问题.

我们真的希望找到一种更好,更有效的方法来实现这一目标.有人可以提供任何提示或建议吗?如果我们手动更新搜索索引的路线,那是否可行?任何人都可以提供资源来解释我们如何将单个ProductSummary添加到索引中吗?

非常感谢您提供的任何帮助.

orb*_*ish 1

如果我正确理解了这个问题,那么您正在尝试执行保留对象并在此时对其进行索引的正常操作,但是您正在处理两个单独的对象。

我发现自己总是在 Hibernate 中做一些糟糕的事情,感觉这几乎是你的要求。是的,这会对性能产生影响,正如您所说,这可能不是什么大问题,因此可能值得进行分析。

我的一部分记得有一种方法可以在写入时刷新对象,并且想知道是否有一种方法可以包装 Product 和 ProductSummary 并调整映射,以便您读取部分内容并编写其中的部分内容(挥手语法和映射)。或者创建一个面向 Hibernate 的对象,其中包含可以拆分和合并到两个对象中的只读字段。我不知道您的设计是否允许仅使用 Hibernate 对象,这是我系统中的常见习惯用法。

如果您在这种情况下有很多对象,那么任何一种方法都会很有用,如果这是您以这种方式搜索的唯一对象,那么您的 3 个步骤看起来会更清晰。

至于手动添加对象的语法,我认为您在获取之后正在寻找类似的内容:

FullTextSession textSession = Search.getFullTextSession(session);
textSession.index(myProductSummary);
Run Code Online (Sandbox Code Playgroud)

这就是你想要的吗?