2016-01-11 2 views
1

Pour un projet, j'essaie de créer une classe dans laquelle je peux extraire des données d'une base de données en mode hibernation.Java - création d'une référence statique à une méthode non statique

Dans cette classe, j'essaie également de faire une liste d'objets créés avec les données extraites de la base de données via un DAO. Mais quand j'essaie de parcourir la liste, eclipse m'avertit que j'essaie de faire une référence statique à une méthode non statique. J'ai eu l'impression que si vous utilisez une instance d'un objet (opérateur op dans ce cas) qui n'est pas statique et qui ne se réfère pas à une méthode statique, cela pourrait fonctionner. Pourquoi cela ne fonctionne-t-il pas et comment puis-je le réparer? Ce qui me rend particulièrement confus, c'est que l'exemple de code donné par l'enseignant fait la même chose mais fonctionne bien.

package Client.DAO; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 

public class mainTest { 

private static EntityManagerFactory entityManagerFactory; 

public static void main(String[] args) { 

    EntityManager em = null; 
    try { 
     entityManagerFactory = HibernateUtil.getEntityManagerFactory(); 
     em = entityManagerFactory.createEntityManager(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 

    operatorDAO dao = new operatorDAOImpl(em); 
    List<operator> operators = dao.findAll(); 
    for (operator op : operators) { 
     System.out.print("Id: " + operator.getID());// <-- This doesnt work 
     System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work 

    } 
} 
} 

Pour référence, code d'exemple de travail. Attention: Long

package nl.hu.ict; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 

import nl.hu.ict.dao.HibernateUtil; 
import nl.hu.ict.dao.LecturerDao; 
import nl.hu.ict.dao.LecturerDaoHibImpl; 
import nl.hu.ict.model.Lecturer; 

public class MyHibernateTest { 

private static EntityManagerFactory entityManagerFactory; 

public static void main(String[] args) { 
    // get the Hibernate - JPA entityManager 
    EntityManager em = null; 
    try { 
     entityManagerFactory = HibernateUtil.getEntityManagerFactory(); 
     em = entityManagerFactory.createEntityManager(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 

    // get the program (not necessary) 
    // MyHibernateTest test = new MyHibernateTest(); 

    LecturerDao lectDao = new LecturerDaoHibImpl(em); 
    Integer id; 

    // handle the database actions 

    // list all lecturers 
    List<Lecturer> lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print("Id: " + lecturer.getID()); 
     System.out.print(", First Name: " + lecturer.getFirstName()); 
     System.out.println(", Last Name: " + lecturer.getLastName()); 
     System.out.println(", Last Name: " + lecturer.getLastName()); 
    } 

    // add an lecturer 
    Lecturer lect = new Lecturer(); 
    lect.setFirstName("Bill"); 
    lect.setLastName("Pianoman"); 
    lectDao.persist(lect); 
    // get the id of the added lecturer 
    id = lect.getID(); 
    // list to view changes 
    lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print(lecturer); 
    } 

    // change a lecturer 
    // find find it again 
    lect = lectDao.findById(id); 
    // change it 
    lect.setFirstName("Billy"); 
    lectDao.update(lect); 
    // list to view changes 
    lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print(lecturer); 
    } 

    // delete a lecturer 
    // find it again 
    lect = lectDao.findById(id); 
    // delete it 
    lectDao.delete(lect); 
    // list to view changes 
    lecturers = lectDao.findAll(); 
    for (Lecturer lecturer : lecturers) { 
     System.out.print(lecturer); 
    } 
    em.close(); 
    System.out.println("-- einde --"); 
} 
} 
+0

Pourriez-vous penser à un exemple radicalement plus facile? – Andremoniy

+0

Vous n'utilisez pas l'objet, vous utilisez la classe. operator.getID() devrait être op.getID() –

Répondre

2

Ceci est une confusion de nommage; dans cette partie du code:

operatorDAO dao = new operatorDAOImpl(em); 
List<operator> operators = dao.findAll(); 
for (operator op : operators) { 
    System.out.print("Id: " + operator.getID());// <-- This doesnt work 
    System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work 
} 

Vous créez une variable locale nommée les opérateurs de se référer à la liste renvoyée par l'appel à la méthode findAll du DAO. Dans le corps de la boucle for, vous avez une variable locale op. Le type de la variable locale op est operator. Mais vous utilisez "operator" comme si c'était le nom d'une variable. Remplacez operator.getID() par op.getID(). Le compilateur pense que vous appelez une méthode d'instance, getID, sur la classe d'opérateur, ce qui explique pourquoi vous obtenez l'erreur "référence statique à une méthode non statique".

Vous pouvez minimiser ces types d'erreurs en suivant une convention de dénomination. Les types (classes et interfaces) doivent commencer par une lettre majuscule. Les variables d'instance et les variables locales doivent commencer par une lettre minuscule. À la suite de la convention ce code devient:

OperatorDAO dao = new OperatorDAOImpl(em); 
List<Operator> operators = dao.findAll(); 
for (Operator operator : operators) { 
    System.out.print("Id: " + operator.getID()); 
    System.out.print(", First Name: " + operator.getName()); 
} 
+0

Ah, vous avez raison. Im en utilisant l'opérateur au lieu d'op, im un idiot. Merci d'avoir répondu! – DyonBeumer

0

Vous vouliez probablement utiliser op au lieu de operator. Ce dernier est un nom de classe et vous essayez d'appeler la méthode sur cette classe qui n'est pas statique.

De plus, java a une très bonne convention qui permettrait d'identifier rapidement ce problème - les classes devraient commencer en majuscules alors que les variables avec les minuscules

0
System.out.print("Id: " + operator.getID());// <-- This doesnt work 
System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work 

devraient être:

System.out.print("Id: " + op.getID());// <-- This doesnt work 
System.out.print(", First Name: " + op.getName()); // <-- This doesnt work 

Vous essayez de Accédez aux méthodes getID et getName en tant que méthode statique lorsque vous souhaitez utiliser la méthode instanciée.