Вам понадобится PreUpdateEventListener
, в этом слушателе проверьте сущность и определите, хотите ли вы добавить ее в индекс lucene.
Этот код не гарантированно работает, но, надеюсь, вы поймете идею.
public class LuceneUpdateListener implements PreUpdateEventListener {
protected FSDirectory directory; // = path to lucene index
public boolean onPreUpdate(PreUpdateEvent event) {
if (event.getEntity() instanceof Employee ) {
try {
Employee employee = (Employee) event.getEntity();
//Remove on update
remove((Employee) event.getEntity(), (Long) event.getId(), directory);
//Add it back if this instance should be indexed
try {
if (employee.shouldBeIndexed()) {
add((Employee) event.getEntity(), (Long) event.getId(), directory);
}
}
catch (Exception e) {
}
}
catch (Exception e) {
throw new CallbackException(e.getMessage());
}
}
}
return false;
}
protected synchronized void add(Employee employee, Id employeeId, FSDirectory directory) {
try{
IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), false);
Document d = LuceneDocumentFactory.makeDocument(employee);
writer.addDocument(d);
writer.close();
directory.close();
}
catch(Exception e) {
}
}
protected synchronized void remove(Long id, FSDirectory directory) throws IOException {
try {
IndexReader ir = IndexReader.open(directory);
ir.deleteDocuments(new Term("id", id.toString()));
ir.close();
}
catch(Exception e) {
}
}
public FSDirectory getDirectory() {
return directory;
}
public void setDirectory(FSDirectory directory) {
this.directory = directory;
}
}
Чтобы проиндексировать эти объекты вне события гибернации, вы можете извлечь из этого логикукласс и обрабатывать ваших сотрудников в пакетном режиме.
Также не забудьте зарегистрировать слушателя.