【发布时间】:2019-07-30 00:03:06
【问题描述】:
我在多租户 Hibernate 应用程序中使用 Hibernate Search。根据this 链接,我希望这可以开箱即用,但搜索结果似乎没有返回新创建的实体。
这是我的映射:
@Entity
@Indexed
public class ItemEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Field
private String name;
@Field
private String description;
@OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("versionNo DESC, lastSaveDate DESC")
@IndexedEmbedded
private List<ItemVersionEntity> versions;
...
}
@Entity
public class ItemVersionEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Field
private String description;
@OneToMany(mappedBy = "version", cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
@IndexedEmbedded
private List<ItemEdgeEntity> edges;
@OneToMany(mappedBy = "version", cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
@IndexedEmbedded
private List<ItemNodeEntity> nodes;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "item_id")
@ContainedIn
private ItemEntity item;
}
@Entity
public class ItemEdgeEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Field
private String text;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "version_id")
@ContainedIn
private ItemVersionEntity version;
}
@Entity
public class ItemNodeEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Field
private String text;
@Field
private String description;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "version_id")
@ContainedIn
private ItemVersionEntity version;
}
添加了一个ItemNodeEntity叫foobar之后,我用this工具查看它出现在索引中(虽然我不太了解索引的结构,也不确定不同的Segment有问题):
Marple image
Luke image
这是一些返回0结果的查询代码:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Session session = sessionFactory.withOptions().tenantIdentifier(tenantIdResolver.resolveCurrentTenantIdentifier()).openSession();
FullTextSession fullTextEM = Search.getFullTextSession(session);
QueryBuilder itemQB = fullTextEM.getSearchFactory().buildQueryBuilder().forEntity(ItemEntity.class).get();
Query mq = itemQB
.keyword()
.onField("versions.nodes.text")
.matching("foobar")
.createQuery();
FullTextQuery ft = fullTextEM.createFullTextQuery(mq, ItemEntity.class);
List<Object> result = ft.getResultList();
请注意,如果我重新索引整个数据库,则上述搜索有效:
FullTextSession fullTextEntityManager = Search.getFullTextSession(session);
fullTextEntityManager.createIndexer().startAndWait();
休眠:5.2.13 休眠搜索:5.9.3
编辑:
似乎在保存ItemVersionEntity 后,__HSearch_TenantId 字段已从 Lucene 文档中删除:
Luke document image
这是实现多租户的方式(基本上遵循this 指南):
@Configuration
public class HibernateConfig {
@Autowired
private JpaProperties jpaProperties;
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
return new HibernateJpaVendorAdapter();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource,
MultiTenantConnectionProvider multiTenantConnectionProviderImpl,
CurrentTenantIdentifierResolver currentTenantIdentifierResolverImpl) {
Map<String, Object> properties = new HashMap<>();
properties.putAll(jpaProperties.getHibernateProperties(new HibernateSettings()));
properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProviderImpl);
properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolverImpl);
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan(...);
em.setJpaVendorAdapter(jpaVendorAdapter());
em.setJpaPropertyMap(properties);
return em;
}
}
【问题讨论】:
标签: hibernate hibernate-search