2016-04-20 28 views
2

Ich habe einige JPA-Klassen und generieren Metamodell über org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor. Also einer meiner Klassen ist:JPA-Metamodellfelder sind null

@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 Prozessor generiert diese:

@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; 

} 

Dann gibt es den folgenden Code in meine Business-Logik-Klassen:

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); 

Dieser Code stürzt ab mit NPE in der zweiten Zeile. Ich habe durch Debugger bemerkt, dass User_ Felder alle null sind. Die Frage ist also: Gibt es eine Möglichkeit, diese Felder zu initialisieren? Wie kann ich das machen?

P.S. Dies ist ein Legacy-Code, es funktionierte für lange Zeit, aber jetzt scheint es irgendwie kaputt zu sein.

+0

JPA Metamodell verwendet wird in Criteria Abfragen nur gemeint, wie erklärt [hier] (https://docs.oracle.com/javaee/6/tutorial/doc/gjrij.html). Ich bin nicht sicher, ob es überhaupt in der Parameterkonstruktion einer benannten Abfrage verwendet werden kann. Beachten Sie auch, dass die Verwendung völlig anders ist als Ihre – perissf

+0

@perissf ich verstehe. Das einzige, was ich nicht verstehe, ist, dass es irgendwie vorher funktioniert hat. Es gibt also große Mengen ähnlichen Legacy-Codes, und ich frage mich, ob es einen Weg gibt, es zu reparieren, ohne das alles neu zu schreiben. – Everv0id

Antwort

0

Die Parameterwerte des JPA-Metamodells sollen null sein. Von dem, was ich bekomme, ist es unmöglich, Zeichenfolge mit Namen von User_.login.getName() zu erhalten, weil User_.login nicht existiert (wird nie initialisiert). User_ ist eine abstrakte Klasse, und diese Werte können nicht initialisiert werden. Die einzige Möglichkeit, Variablennamen aus dem Metamodell zu erhalten, besteht darin, sie alle zu erhalten. Ich verwende folgendes Programm

public class EntityReader { 
    public static<T> String[] getArguments(Class<T> classToRead){ 
     Field[] fields = classToRead.getFields(); 
     String[] result = new String[fields.length]; 
     for (int i = 0; i < fields.length; i++) result[i] = fields[i].getName(); 
     return result; 
    } 
}