inner framework example data and java hibernate getter-setter

java - framework - ¿Hibernate siempre necesita un setter cuando hay un getter?



lombok java framework (5)

Tenemos algunos métodos getter de Hibernate anotados con @Column y @Basic .

Obtenemos una excepción si no tenemos el colocador correspondiente. ¿Por qué es esto?

En nuestro caso, estamos derivando el valor devuelto por el getter (para ser almacenado en el DB) y el setter no tiene un propósito funcional. Entonces, tenemos un método vacío para evitar la condición de error.


Como han mencionado otros, si anota un método getter de propiedad, entonces Hibernate usa el setter cuando lee valores de la base de datos. Básicamente, Hibernate supone que todo lo que está escribiendo en la base de datos necesitará leerse en la base de datos. Esto implica que si anota un getter, entonces necesita llamar a un setter cuando lee el objeto de la base de datos.

Puede hacer que el colocador sea privado (Hibernate usará la reflexión para acceder al colocador). Esta es una gran manera de preservar el contrato de su clase mientras sigue usando Hibernate para el mapeo relacional.

Si el campo se deriva de otras propiedades de la clase, ¿por qué lo está almacenando en la base de datos? Puede usar la anotación @Transient para marcar el campo que no debe almacenarse en la base de datos. Incluso puede usar la anotación @Formula para que Hibernate obtenga el campo por usted (lo hace usando la fórmula en la consulta que envía a la base de datos).


Debe anotar sus clases con @Entity(access = AccessType.FIELD) y anotar sus atributos. Esto debería solucionar tu problema. El colocador es la mejor manera de apoyar la refactorización. Y cuál es el problema de tener al pequeño setter allí.


Hibernate usa el método set para inicializar la entidad que está leyendo desde su DB.

Tal vez, si haces que los modificadores de acceso de los campos de la entidad sean default o protected o public entonces Hibernate inicializará los campos directamente sin utilizar setter (leí algo al respecto, pero no estoy seguro de que funcione). Pero usar setter es una forma mucho más preferida.


Si no usa setters y usa atributos privados, Hibernate tendría que recuperar campos por reflexión y hacer field.setAccessible (true). No creo que Hibernate haga eso.

Realmente no sé si podemos decirle a Hibernate que haga eso, pero hasta donde recuerdo, la configuración predeterminada usa setters ... Ponga un log / sysout en un conjunto y verá que usa el setter.


access = field si no quieres usar setters

<id name="countryId" column="id" type="int"> <generator class="increment"> </generator> </id> <property name="name" column="name" access="field" type="string"></property> <property name="countryCode" column="country_code" access= "field" type="string"></property>