У меня есть то, что я считаю простым вопросом. Я видел примеры в обоих направлениях. Вопрос в том, «почему я не могу разместить свои аннотации на поле?». Позвольте привести пример ....
@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;}
}
Приведенный выше код работает нормально (при условии, что там нет опечатки). Когда аннотация размещается на получателе объекта, все идеально.
Однако это кажется мне неловким. На мой взгляд, чище разместить аннотацию на поле, например:
@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;}
}
Я видел примеры обоих способов. Однако, когда я запускаю этот второй пример, я получаю следующее ...
java.lang.NullPointerException
at com.widget.util.hibernate.HibernateSessionFactory$ThreadLocalSession.initialValue(HibernateSessionFactory.java:25)
at com.widget.util.hibernate.HibernateSessionFactory$ThreadLocalSession.initialValue(HibernateSessionFactory.java:1)
at java.lang.ThreadLocal$ThreadLocalMap.getAfterMiss(Unknown Source)
at java.lang.ThreadLocal$ThreadLocalMap.get(Unknown Source)
at java.lang.ThreadLocal$ThreadLocalMap.access$000(Unknown Source)
at java.lang.ThreadLocal.get(Unknown Source)
at com.widget.util.hibernate.HibernateSessionFactory.get(HibernateSessionFactory.java:33)
at com.widget.db.dao.AbstractDao.(AbstractDao.java:12)
at com.widget.db.dao.WidgetDao.(WidgetDao.java:9)
at com.widget.db.dao.test.WidgetDaoTest.findById(WidgetDaoTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
...
Вот скелет HibernateSessionFactory
(отмечена строка 25) ....
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;
}
Кто-нибудь имеет представление, что здесь происходит?