web-dev-qa-db-fra.com

Hibernate a-t-il toujours besoin d'un setter quand il y a un getter?

Nous avons quelques méthodes getter Hibernate annotées avec les deux @Column et @Basic.

Nous obtenons une exception si nous n'avons pas le setter correspondant. Pourquoi est-ce?

Dans notre cas, nous dérivons la valeur retournée par le getter (pour être stocké dans la base de données) et le setter n'a pas de fonction. Nous avons donc juste une méthode vide pour contourner la condition d'erreur ..

57
Marcus Leon

Comme d'autres l'ont mentionné, si vous annotez une méthode getter de propriété, Hibernate utilise le setter lors de la lecture des valeurs de la base de données. Fondamentalement, Hibernate suppose que tout ce qu'il écrit dans la base de données devra éventuellement être lu dans la base de données. Cela implique que si vous annotez un getter, il doit alors appeler un setter lors de la lecture de l'objet dans la base de données.

Vous pouvez rendre le setter privé (Hibernate utilisera la réflexion pour accéder au setter). C'est un excellent moyen de conserver le contrat de votre classe tout en utilisant Hibernate pour la cartographie relationnelle.

Si le champ est dérivé d'autres propriétés de la classe, alors pourquoi le stockez-vous dans la base de données? Vous pouvez utiliser le @Transient annotation pour marquer le champ qui ne doit pas être stocké dans la base de données. Vous pouvez même utiliser le @Formula annotation pour qu'Hibernate dérive le champ pour vous (il le fait en utilisant la formule dans la requête qu'il envoie à la base de données).

75
Jim Hurne

Vous devez annoter vos classes avec la @Entity(access = AccessType.FIELD) et annoter vos attributs. Cela devrait résoudre votre problème. Le passeur est le meilleur moyen de soutenir le refactoring. Et quel est le problème avec le petit setter là-bas.

9
khmarbaise

Ensemble access="field" si vous ne souhaitez pas utiliser de setters:

<class name="com.demo.hibernate.Country" table="country">
  <id name="countryId" column="id" type="int">
    <generator class="increment" />
  </id>
  <property name="name" column="name" access="field" type="string" />
  <property name="countryCode" column="country_code" access="field" type="string" />
</class>
5
vsingh

Hibernate utilise la méthode set pour initialiser l'entité que vous lisez dans votre base de données.

Peut-être que si vous modifiez l'accès aux champs d'entité default ou protected ou public, Hibernate initialisera directement les champs sans utiliser setter (je lis quelque chose à ce sujet mais je ne suis pas sûr que cela fonctionne). Mais utiliser setter est une manière beaucoup plus préférée.

1
Roman