hi,
Our entities are very complex, so I created some dummy ones to simulate the issue. The indexed entity is IndexedSaleEventItem which is associated with IndexedInventory which in turn is associated with IndexedPurchaseInformation. When I attempt to index the IndexedSaleEventItem, it fires a query for loading the IndexedInventory which is fine since it has an embedded index. But it also fires a query for IndexedPurchaseInformation which has no indexed fields and is marked as lazy fetched. In my actual entity, there are multiple lazy loaded fields which are causing such multiple queries to be executed making the indexing slow.
The query logs, entities and indexing code are included below.
Hibernate: select distinct indexedsal0_.SALE_EVENT_ITEM_ID as SALE1_60_, indexedsal0_.AUCTION_TYPE as AUCTION2_60_, indexedsal0_.INVENTORY_ID as INVENTORY28_60_, indexedsal0_.ITEM_DESCRIPTION as ITEM3_60_, indexedsal0_.SALE_EVENT_ID as SALE29_60_ from ATL_SALE_EVENT_ITEM indexedsal0_
Number of entities to be indexed 266
indexing 0
Hibernate: select indexedinv0_.INVENTORY_ID as INVENTORY1_59_0_, indexedinv0_.LAST_UPDATE_TIME_STAMP as LAST2_59_0_, indexedinv0_.LAST_UPDATE_USER_ID as LAST3_59_0_, indexedinv0_.REC_CRE_TIME_STAMP as REC4_59_0_, indexedinv0_.REC_CRE_USER_ID as REC5_59_0_, indexedinv0_.MAKE as MAKE59_0_ from ATL_INVENTORY indexedinv0_ where indexedinv0_.INVENTORY_ID=?
Hibernate: select indexedpur0_.PURCHASE_INFO_ID as PURCHASE1_9_0_, indexedpur0_.LAST_UPDATE_TIME_STAMP as LAST2_9_0_, indexedpur0_.LAST_UPDATE_USER_ID as LAST3_9_0_, indexedpur0_.REC_CRE_TIME_STAMP as REC4_9_0_, indexedpur0_.REC_CRE_USER_ID as REC5_9_0_, indexedpur0_.PURCHASE_AMOUNT as PURCHASE6_9_0_, indexedpur0_.INVENTORY_ID as INVENTORY13_9_0_, indexedpur0_.PURCHASE_DATE as PURCHASE10_9_0_ from ATL_PURCHASE_INFORMATION indexedpur0_ where indexedpur0_.INVENTORY_ID=?
indexing 1
Hibernate: select indexedinv0_.INVENTORY_ID as INVENTORY1_59_0_, indexedinv0_.LAST_UPDATE_TIME_STAMP as LAST2_59_0_, indexedinv0_.LAST_UPDATE_USER_ID as LAST3_59_0_, indexedinv0_.REC_CRE_TIME_STAMP as REC4_59_0_, indexedinv0_.REC_CRE_USER_ID as REC5_59_0_, indexedinv0_.MAKE as MAKE59_0_ from ATL_INVENTORY indexedinv0_ where indexedinv0_.INVENTORY_ID=?
Hibernate: select indexedpur0_.PURCHASE_INFO_ID as PURCHASE1_9_0_, indexedpur0_.LAST_UPDATE_TIME_STAMP as LAST2_9_0_, indexedpur0_.LAST_UPDATE_USER_ID as LAST3_9_0_, indexedpur0_.REC_CRE_TIME_STAMP as REC4_9_0_, indexedpur0_.REC_CRE_USER_ID as REC5_9_0_, indexedpur0_.PURCHASE_AMOUNT as PURCHASE6_9_0_, indexedpur0_.INVENTORY_ID as INVENTORY13_9_0_, indexedpur0_.PURCHASE_DATE as PURCHASE10_9_0_ from ATL_PURCHASE_INFORMATION indexedpur0_ where indexedpur0_.INVENTORY_ID=?
Code:
@Indexed
@Entity
@Table(name = "ATL_SALE_EVENT_ITEM")
public class IndexedSaleEventItem implements Serializable {
/**
* Comment for <code>serialVersionUID</code>.
*/
private static final long serialVersionUID = -4745509173261900608L;
/** The Unique Identifier. */
@DocumentId
@Id
@GeneratedValue
@Column(name = "SALE_EVENT_ITEM_ID")
private Long id;
/** The saleEvent.*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SALE_EVENT_ID")
private SaleEvent saleEvent;
/** The inventoryId.*/
@IndexedEmbedded
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INVENTORY_ID")
private IndexedInventory inventory;
/** The auctionType. */
@Column(name = "AUCTION_TYPE")
private String auctionType;
@Field(index=Index.TOKENIZED, store=org.hibernate.search.annotations.Store.NO)
/** The itemDescription. */
@Column(name = "ITEM_DESCRIPTION")
private String itemDescription;
// getters and setters
}
@Entity
@Table(name = "ATL_INVENTORY")
public class IndexedInventory extends Trackable implements Serializable {
/** Comment for serialVersionUID. */
private static final long serialVersionUID = -440936293775306289L;
/** The Unique Identifier. */
@Id
@GeneratedValue
@Column(name = "INVENTORY_ID")
private Long id;
/** The make of the Inventory. */
@Field(index=Index.TOKENIZED, store=org.hibernate.search.annotations.Store.NO)
@Column(name = "MAKE")
private String make;
@ContainedIn
@OneToMany(mappedBy="inventory", fetch = FetchType.LAZY)
private Collection<IndexedSaleEventItem> saleEventItems;
/** Purcahse Information for the item. */
@OneToOne(fetch = FetchType.LAZY, mappedBy = "inventory")
private IndexedPurchaseInformation purchaseInformation;
// getters and setters
}
@Entity
@Table(name = "ATL_PURCHASE_INFORMATION")
public class IndexedPurchaseInformation extends Trackable implements Serializable {
/**
* Comment for <code>serialVersionUID.</code>
*/
private static final long serialVersionUID = -6535271186496400341L;
/** The id. */
@Id
@GeneratedValue
@Column(name = "PURCHASE_INFO_ID")
private Long id;
/** The amount. */
@Column(name = "PURCHASE_AMOUNT")
private Double amount;
/** The purchaseDate. */
@Column(name = "PURCHASE_DATE")
private Date purchaseDate;
/** The inventory. */
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "INVENTORY_ID")
private IndexedInventory inventory;
// getters and setters
}
// Indexing code
EntityManager em = getAdesaJpaTemplate().getEntityManagerFactory()
.createEntityManager();
FullTextEntityManager fullTextEntityManager = Search
.getFullTextEntityManager(em);
List entities = em
.createQuery(
"select distinct saleEventItem from IndexedSaleEventItem as saleEventItem " )
.getResultList();
System.out.println("Number of entities to be indexed "
+ entities.size());
long startTIme = System.currentTimeMillis();
int i = 0;
for (Object entity : entities) {
System.out.println("indexing " + i++);
fullTextEntityManager.index(entity);
//break;
}
Thanks,
Seema