2012-09-10 13 views
11

Esta pregunta es esencialmente lo contrario de this one.¿Cómo hacer que Hibernate ignore un método?

tengo un método de este modo:

public boolean isVacant() { 
    return getEmployeeNum() != null && getEmployeeNum().equals("00000000"); 
} 

Cuando cargo hasta que, Hibernate se queja de que no tengo ningún atributo llamado vacant. Pero no quiero un atributo llamado vacant - No necesito almacenar esos datos - es simplemente lógica.

Hibernate dice:

org.hibernate.PropertyNotFoundException: No se pudo encontrar un regulador de propiedad vacante en com.mycomp.myclass clase ...

¿Existe una anotación que pueda añadir a mi método isVacant() para hacer que Hibernate lo ignore?

Respuesta

25

Agregue @Transient al método, entonces Hibernate debe ignorarlo.

citar el Hibernate Documentation:

Cada propiedad no estática no transitoria (campo o método en función del tipo de acceso) de una entidad que se considera persistente, a menos que anotar como @Transient.

+0

Doh - Pensé que '@ Transient' era solo para campos ... – corsiKa

3

RNJ es correcta, pero podría añadir por qué sucede esto:

supongo que ha anotado los captadores de la clase persistente. Los prefijos utilizados por Java Bean son "set" y "get", que se utilizan para leer y escribir en variables, pero también existe el prefijo "is", que se usa para valores booleanos (en lugar de "get"). Cuando Hibernate ve su clase persistente anotada con getter, y encuentra un método "isVacant", asume que hay una propiedad "vacante", y asume que también hay un "set" -método.

Por lo tanto, para solucionarlo, puede agregar la anotación @Transient, o puede cambiar el nombre de su método a algo que no comienza con "es". No creo que esto sea un problema si tu clase fue anotada en los campos, en lugar de los métodos get.

+3

El problema con el cambio de nombre del método, sin embargo, es que eso también infringe la convención. Por convención, los métodos que devuelven booleanos (sean o no miembros) comienzan con is o has. Considere el método 'java.util.Collection'' isEmpty() '- la mayoría de las colecciones no almacenan si están vacías o no: comparan su tamaño con 0. (Esto no es cierto para todas las colecciones, por ejemplo' ConcurrentLinkedQueue' , pero es para la mayoría, tanto así que 'AbstractCollection' lo implementa como tal.) – corsiKa

Cuestiones relacionadas