ah, I've some experience with these kind of experiments, so you asked for my rant :-) :
Lucene's index is not containing the full representation of the entity, and the transformations applied are not bi-directional, so it's not possible to look into the index to find out if it's different than the database stored representation. Even if you made this possible by storing much more usually unneeded information in the index, it is far less efficient to read this data back than to batch-rebuild the index.
Another approach is to have a flag column containing a boolean "needsReindexing", this is the best solution I've seen, or alternatively using the version of the entity when using hibernate's optimistic locking and store the version information in the index; but using the version information you'll have to load the entities one by one, which again makes it inefficient.
My conclusion is that, unless you have a very small amount of updates compared to huge amount of indexed data, your best bet is to reindex it all periodically; which has btw many other benefits: like if you change analyzers, add new synonyms and/or stopwords, the existing index entries will be updated too.
In fact reindexing it all can be done quite fast, since latest beta this API is available which is the most efficient strategy we could think of:
http://in.relation.to/Bloggers/HibernateSearch32FastIndexRebuild