gpt4 book ai didi

java - Hibernate 搜索可在两个不同实体对象的同一索引上工作

转载 作者:行者123 更新时间:2023-12-02 02:05:09 24 4
gpt4 key购买 nike

两个不同的实体指向数据库中的同一个表,hibernate 搜索是否可以为它们创建和管理单个索引,因为从技术上讲它们指向同一个表?在我的场景中,创建了两个不同的索引。我如何告诉 hibernate 搜索在同一个索引上工作

Person1.java

@Entity
@Indexed(index = "com.Company.Person")
@Table(name = "Person")
public class Person
{
@Id
@Column(name = "PERSON_ID")
Long id;

@Field
@Column(name = "NAME_FIRST_KEY")
String firstKey;
}

Person2.java

    @Entity
@Indexed(index = "com.Company.Person")
@Table(name = "Person")
public class WritablePerson
{
@Id
@Column(name = "PERSON_ID")
Long id;

@Field
@Column(name = "NAME_FIRST_KEY")
String firstKey;
}

我已经让两个类都指向相同的索引“com.Company.Person”,但它仍然根据索引中的 _hibernate_class 将它们分开。

我有两个实体指向同一个表的原因是,在我们的生产代码中我们有两个不同的实体。一个用于写入,另一个用于读取。所以我希望我的索引保持同步。

如果我使用相同的实体进行读取和写入,那么一切都会按预期进行。但是还有其他方法可以让上述场景发挥作用吗?

最佳答案

如果我理解正确,当您写入数据库时​​,您使用 WritablePerson 实体类型,因此 _hibernate_class 字段设置为 org.company。 WritablePerson,但在搜索时,您希望获得 org.company.Person 类型的结果,对于最初编写为 org.company.WritablePerson 的相同文档.

没有对此的内置支持。然而,有一些方法可以让你自己做;您将(遗憾地)必须重新实现 Hibernate Search 通常提供的开箱即用的部分功能,并且还可能会丢失我们为对象加载实现的一些性能优化,但这应该是可能的。

本质上,这个想法是对 ID 执行投影查询,然后显式加载与这些 ID 对应的实体:

List<Person> myQueryMethod(<some params>) {
FullTextEntityManager em = ...;
Query luceneQuery = ...;
FullTextQuery query = em.createFullTextQuery( luceneQuery, WriteablePerson.class );
query.setProjection( org.hibernate.search.engine.ProjectionConstants.ID );
List<Object[]> projections = query.getResultList();
return loadResults( Person.class, projections );
}

<T> List<T> loadResults(Class<T> clazz, List<Object[]> idProjections) {
List<Serializable> ids = new ArrayList<>( idProjections.size() );
for ( Object[] projection : idProjections ) {
ids.add( (Serializable) projection[0] );
}
return em.unwrap( Session.class ).byMultipleIds( clazz )
.with( CacheMode.<pick a cache mode> ) // May be ommitted
.withBatchSize( <pick a batch size> ) // May be ommitted
.multiLoad( ids );
}

关于java - Hibernate 搜索可在两个不同实体对象的同一索引上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50955010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com