Como implementar equals com hibernate sem arriscar perder a propriedade simétrica?

Depois de ler em cima (mais uma vez, deveria ter feito isso há muito tempo) implementando equals e hashcode corretamente cheguei a estas conclusões, que funciona para mim:

Se pré JDK 7: Prefere usar o Apache commons equalsbuilder e hashcodebuilder. (ou goiaba). Seus javadocs contêm exemplos de como usá-los no bom sentido.

Se o JDK 7 ++: Use a nova classe de utilitário Objetos

Mas, se estiver escrevendo para o modo de hibernação alguns requistes especiais aparecem (veja fontes mais abaixo). Entre eles estão o uso recomendado deinstancia de ao invés degetClass, devido ao hibernate criando proxys de subclasses que são carregadas com preguiça.

Mas, como eu entendo, se isso ocorrer, outro possível problema ocorre: O motivo para usar getClass é garantir a propriedade simétrica do contrato de igual. JavaDocs:

*It is symmetric: for any non-null reference values x and y, x.equals(y) 
 should return true if and only if y.equals(x) returns true.*

E usando instanceof, é possível não ser simétrico. Exemplo: B estende A. A é igual a um caso de checagem de A. B é igual a um exemplo de checagem de B. Dê A a e B b:

a.equals (b) -> true b.equals (a) -> false

Como implementar equals com hibernate sem arriscar perder a propriedade simétrica? Parece que não estou seguro quando uso o getClass, e não estou seguro quando uso o instanceof?

É a resposta para nunca adicionar membros significativos às subclasses e, em seguida, estar seguro ao usar instanceof (para hibernate that is)?

Fontes eu li:

Quais problemas devem ser considerados ao substituir equals e hashCode em Java?

Itens 7 e 8 em Josh Blochs livro excelente "Java eficaz",http://web.archive.org/web/20110622072109/http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

Sobre o Java 7:http://www.javacodegeeks.com/2012/11/guavas-objects-class-equals-hashcode-and-tostring.html

questionAnswers(3)

yourAnswerToTheQuestion