I have some JPA classes and generate metamodel through org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
. So, one of my classes is:
@Table(name = "USER")
@Entity
@NamedQueries({@NamedQuery(name = "User.byLogin", query = "select u from User u where u.login = :login and u.active = :active")})
public class User implements Serializable {
@Column(name = "ID")
@Id
private Long id;
@Column(name = "LOGIN")
private String login;
@Column(name = "ACTIVE")
private Boolean active;
// etc..
}
Metamodel processor generates this:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(User.class)
public abstract class User_ {
public static volatile SingularAttribute<User, Long> id;
public static volatile SingularAttribute<User, Boolean> active;
public static volatile SingularAttribute<User, String> login;
}
Then, there is the following code in my business logic classes:
Map<String, Object> params = new HashMap<String, Object>();
params.put(User_.login.getName(), username);
params.put(User_.active.getName(), Boolean.TRUE);
userDao.executeNamedQuery("User.byLogin", params);
This code crashes with NPE on at the second line. I noticed through debugger that User_
fields are all null
. So, the question is: is there a way to initialize these fields? How can i do that?
P.S. This is a legacy code, it worked fine for long time, but now it seems to be broken somehow.
These fields are supposed to be initialized by the persistence provider during initialization. See the documentation (section 6.2.2). The problem most likely is that there is no bootstrapping happening, so no persistence unit creation does occur.
From my experience, that can often happen in unit tests, for instance. It is a very common case when we do not bootstrap the entity manager factory, but in test we rely on that these fields are initialized - they simply do not. But without any additional information, it is hard to say where exactly the problem lies.
UPDATE:
There's a good discussion about how to work this around in tests in this SO thread.
Hope it helped, have a nice day :)