Hibernate Annotations Placement Question
J'ai obtenu ce que je pense que c'est une simple question. J'ai vu des exemples dans les deux sens. La question est "pourquoi ne puis-je placer mes annotations sur le terrain?". Laissez-moi vous donner un exemple....
@Entity
@Table(name="widget")
public class Widget {
private Integer id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() { return this.id; }
public Integer setId(Integer Id) { this.id = id;}
}
Le code ci-dessus fonctionne très bien (en supposant qu'il n'est pas une faute de frappe là). Lorsque l'annotation est placé sur le getter de la propriété, tout est parfait.
Cependant, qui semble gênant pour moi. Dans mon esprit c'est plus propre de placer l'annotation sur le terrain, comme --
@Entity
@Table(name="widget")
public class Widget {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
public Integer getId() { return this.id; }
public Integer setId(Integer Id) { this.id = id;}
}
J'ai vu des exemples de ces deux façons. Cependant, lorsque je lance ce second exemple, j'ai le...
java.lang.NullPointerException au com.widget.util.hibernate.HibernateSessionFactory$ThreadLocalSession.initialValue(HibernateSessionFactory.java:25) au com.widget.util.hibernate.HibernateSessionFactory$ThreadLocalSession.initialValue(HibernateSessionFactory.java:1) à java.lang.ThreadLocal$ThreadLocalMap.getAfterMiss(Source Inconnue) à java.lang.ThreadLocal$ThreadLocalMap.get(Source Inconnue) à java.lang.ThreadLocal$ThreadLocalMap.l'accès$000(Source Inconnue) à java.lang.ThreadLocal.get(Source Inconnue) au com.widget de.util.mise en veille prolongée.HibernateSessionFactory.get(HibernateSessionFactory.java:33) au com.widget de.db.dao.AbstractDao.(AbstractDao.java:12) au com.widget de.db.dao.WidgetDao.(WidgetDao.java:9) au com.widget de.db.dao.test.WidgetDaoTest.findById(WidgetDaoTest.java:17) au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method) au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke(Source Inconnue) au coucher du soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(Source Inconnue) à java.lang.de réfléchir.La méthode.invoke(Source Inconnue) ...
Voici le squelette de HibernateSessionFactory
(ligne 25 est marqué) ....
protected Session initialValue() {
SessionFactory sessionFactory = null;
try {
Configuration cfg = new AnnotationConfiguration().configure();
String url = System.getProperty("jdbc.url");
if (url != null) {
cfg.setProperty("hibernate.connection.url", url);
}
sessionFactory = cfg.buildSessionFactory();
}
catch (Exception e) {
}
Session session = sessionFactory.openSession(); //LINE 25
return session;
}
Quelqu'un a une idée de ce qui se passe ici?
- Peut-être que vous avalez une exception dans le bloc catch en ligne 22?
Vous devez vous connecter pour publier un commentaire.
De performance et de conception, en utilisant des annotations sur les méthodes de lecture est une meilleure idée que les variables membres, parce que le getter setters sont appelées à l'aide de réflexion s'il est placé sur le terrain, qu'une méthode. Aussi, si vous prévoyez d'utiliser la validation et les autres fonctionnalités de mise en veille prolongée, vous aurez toutes les annotations à un seul endroit, plutôt que d'éparpiller dans tous les sens.
Ma recommandation aller avec des méthodes qui ne sont pas des variables membres.
À partir de la documentation
because the getter setters are called using reflection
, comment beaucoup plus lent? Avez-vous une estimation approximative de combien de temps il faut pour utiliser la Réflexion plutôt que de la lecture et de définition d'un champ(s)? MerciTu m'as eu sur la bonne voie toolkit. Merci. Voici l'affaire... bien sûr, mon exemple artificiel ne comprend pas toute l'histoire. Mon Widget de la classe était en fait beaucoup plus grande que l'exemple que j'ai donné. J'ai plusieurs champs supplémentaires/getters et j'ai été MÉLANGE mes annotations. J'ai donc été l'annotation de l' @Id sur le terrain, mais d'autres étaient annotés sur la lecture.
Donc la morale de l'histoire est que vous ne pouvez pas mélanger annotation endroits. Soit toutes les annotations sont sur les domaines ou ils sont sur les méthodes de lecture. Longtemps Java et mise en veille prolongée, de nouvelles Annotations. Apprendre quelque chose chaque jour.
Une fois que je savais ce que pour Google, je suis tombé sur ce qui a été utile - http://chstath.blogspot.com/2007/05/field-access-vs-property-access-in-jpa.html
Bien sûr, cela amène la question de savoir qui est le meilleur de la conception et de la performance de points de vue.
Une longue portée, mais avez-vous une vieille
*.hbm.xml
fichier flottant autour?Peut-être il pourrait être le mauvais réglage pour
default-access
et à l'aide deproperty
au lieu defield
?C'est un très beau lien qui peut vous aider avec la compréhension de la accesstypes et la relted pratiques exemplaires!
Understading @AccessType en veille prolongée
Ne fonctionnera pas si vous procédez de la manière suivante: