I have 2 classes Item and Desk. An item can be "desked" at one Desk. Only the Item is indexed in Lucene. (Desk is indexed using the IndexEmbedded annotation)
The problem is that when the name of a Desk is updated, the Item index is not updated, altough I'm using IndexEmbedded and ContainedIn...
Here are the 2 classes:
Code:
@Entity
@Indexed
@Table(name="ITEMS")
public final class Item {
private static final int MAX_SHORT_STRING_LENGTH = 55;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seqItems")
@SequenceGenerator(name="seqItems", sequenceName="SEQ_ITEMS",allocationSize = 1)
private Long id;
@ManyToOne(fetch= FetchType.LAZY)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="desk_id", nullable=true)
@IndexedEmbedded
private Desk desk;
}
Code:
@Entity
@Table(name="DESKS")
public final class Desk {
@Id
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seqDesks")
@SequenceGenerator(name="seqDesks", sequenceName="SEQ_DESKS",allocationSize = 1)
private Long id;
@Column(name="name", nullable = false)
@Field(index= Index.TOKENIZED)
@Analyzer(impl = SimpleAnalyzer.class) //Only applies the toLowerCase Tokenizer
private String name;
@ContainedIn
@OneToMany(mappedBy="desk", fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
private Set<Item> items;
}
The test I use to reproduce the problem:
Code:
@Test
public void testSave() throws LuceneQueryFactoryException, ParseException {
//Save Wire
Wire wire = new Wire();
wire.setName(DeskDaoImplIT.class.getSimpleName() + "Wire");
wireDao.persist(wire);
//Save desk
Desk desk = new Desk();
desk.setName(DeskDaoImplIT.class.getSimpleName() + "Desk");
deskDao.persist(desk);
assertNotNull(desk.getId());
//Save item
Item item = new Item();
item.setCode("testitem");
item.setDesk(desk);
item.setWire(wire);
itemDao.persist(item);
assertNotNull(item.getId());
itemDao.flushToIndexes();
LuceneQueryFactory factory = LuceneQueryFactoryAPIImpl.getInstance();
QueryDto q = new QueryDto();
DeskDto deskDto = new DeskDto();
deskDto.setName(desk.getName());
q.setDesk(deskDto);
PaginationItemModelDto result = itemDao.searchItems(factory.createLuceneQuery(q), 10,0, SortDto.NONE);
assertTrue(result.getResultSize() > 0);
desk.setName("newdeskname");
itemDao.update(item);
Desk deskFromDao = deskDao.find(desk.getId());
assertEquals(desk, deskFromDao);
itemDao.flushToIndexes();
q = new QueryDto();
deskDto = new DeskDto();
deskDto.setName(desk.getName());
q.setDesk(deskDto);
result = itemDao.searchItems(factory.createLuceneQuery(q), 10,0, SortDto.NONE);
assertTrue(result.getResultSize() > 0);
}
It is the last assert that is failing (assertTrue)
I'm using Hibernate Search 3.2.0.Final:
Code:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>3.2.0.Final</version>
</dependency>
Can anybody tell me what I'm doing wrong?
PS
If I add the @indexed annotation above Desk. The update is executed in the Desk index, but still not in the Item index.